Skip to main content

calculus and analysis - Residue failed to reproduce this residue in a paper


This problem is a more clearly state of my original problem which is off topic, so I reconsider my problem carefully based on previous discussions, and gives the following valid code to reproduce my problem with all the necessary information.


I use Mathematica to confirm a result from a paper Unsteady unidirectional flow of Bingham fluid between parallel plates with different given volume flow rate conditions which is to calculate the residue of a expression at zero.



  1. Reproduce of my problem:



The following code shows my efforts, but failed to reproduce the analytical solution (resAna in the code) in the papaer.


ClearAll["Global`*"]

varCons = {ν > 0, up > 0, h > h0 >= 0, h > y >= 0};
m = Sqrt[s]/Sqrt[ν];
Δ = Sinh[m h] Sinh[m h0] - Cosh[m h] Cosh[m h0];
Ξ = Cosh[m h0] (Sinh[m h] - Sinh[m h0]) - Sinh[m h0] (Cosh[m h] - Cosh[m h0]);
Ω = (m h (Δ + Cosh[m h0] Cosh[m y] - Sinh[m h0] Sinh[m y]))/(m h Δ +
m h0 (Cosh[m h0]^2 - Sinh[m h0]^2) + Ξ);

u = FullSimplify[up/(t0 s^2) Ω E^(s t), varCons];

Residue[u, {s, 0}]
(* this failed gives the desired 'resAna' as below *)

X1 = (1/6 (h^3 - y^3) h0 + 1/6 (h - y) h0^3 - 1/4 (h^2 - y^2) h0^2 -1/24 (h^4 - y^4)) (1/ν)^(5/2);
X2 = ((h - y) h0 - 1/2 (h^2 - y^2)) t (1/ν)^(3/2);
X3 = (h^5/30 - (h^4 h0)/8 + (h^3 h0^2)/6 - (h^2 h0^3)/4 + (21 h0^5)/120) (1/2 (h^2 - y^2) - (h - y) h0)/(h0^3/6 - (h0 h^2)/2 + h^3/3) (1/ν)^(5/2);
resAna = -((up h)/t0) (X1 + X2 + X3)/((h0^3/6 - (h0 h^2)/2 + h^3/3) (1/ν)^(3/2));
(* resAna is the analytical solution in the paper *)


enter image description here 2. Some numerical tries to get a clue or two


NResidue seems works after given a set of numeric values, but Residue still doesn't work


t0 = 1/10;
t = 2 t0;
up = 1/100;
ν = 2/3580;
h = 1/1000;
h0 = h/8;
y = h/9;


Needs["NumericalCalculus`"]
NResidue[u, {s, 0}, WorkingPrecision -> 20, PrecisionGoal -> 20] // Chop

N[resAna, 20]

Residue[u, {s, 0}]

enter image description here 3. I had thought that Residue should work as in this example by @xzczd


ClearAll["Global`*"]

r = 1;
f[p_, ξ_] = -(5 p Sqrt[(5 p^2)/6 + ξ^2])/(4 (-4 ξ^2 Sqrt[(5 p^2)/6 + ξ^2] Sqrt[(5 p^2)/2 + ξ^2] + ((5 p^2)/2 + 2 ξ^2)^2));
poles = p /. Simplify[Solve[Denominator[f[p, ξ]] == 0, p], ξ > 0]
Residue[f[p, ξ], {p, #}] & /@ poles;
Simplify[%, ξ > 0] // N

Answer




I. A summary for the failing trial






  1. Residue can't calculate the residue of u directly. (It's hard to tell whether it's a bug or not, Residue never promises he will calculate every known residue, anyway.)




  2. SeriesCoefficient won't give desired answer in the following case:


    SeriesCoefficient[u, {s, 0, -1}]

    enter image description here


    If it gave the desired answer, we would be able to calculate the residue by finding Laurent series expansions.





  3. Limit won't give desired answer in the following case:


    Limit[D[s^2 u, s], s -> 0]

    If it gave the desired answer, we would be able to calculate the residue with limit formula.





II. Solution




By observing the structure of undesired output of SeriesCoefficient and u


enter image description here


I guess that maybe it's the $\sqrt{\nu}$ term that causes trouble, so I tried adding the known constraint $\nu>0$ to SeriesCoefficient and Limit, and they give the desired answer then:


resAnaTrue = 
Simplify[SeriesCoefficient[u, {s, 0, -1}, Assumptions -> ν > 0], ν > 0];

resAnaTrue2 = Limit[D[s^2 u, s], s -> 0, Assumptions -> ν > 0]
(* -(h up (h - y) (h - 2 h0 + y) (2 h^3 - 6 h^2 h0 -
2 h (2 h0^2 - 10 h0 y + 5 y^2 + 60 t ν) -
h0 (7 h0^2 - 10 h0 y + 5 y^2 + 60 t ν)))/(20 (h - h0)^2 (2 h + h0)^2 t0 ν) *)


resAnaTrue == resAnaTrue2 // Simplify
(* True *)


III. The formula given in the paper is incorrect



Let's first check the result with the parameters given by you:


para = {t0 -> 1/10, t -> 2 t0, up -> 1/100, ν -> 2/3580, h -> 1/1000, h0 -> h/8, y -> h/9};
ref = NResidue[u //. para, {s, 0}, WorkingPrecision -> 64];

rst1 = N[resAna //. para, 64];
rst2 = N[resAnaTrue //. para, 64];
ref - rst1
(* -2.9855303465924184799970408331399786805478493918575833694822*10^-7 *)
ref - rst2
(* 0.*10^-66 *)

As one can see, the precision of the new derived formula is desired, while there's a significant difference (approximately 3*10^-7) between the formula given in the paper and numeric result.


With the following set of parameter, the difference will be even clearer:


para2 = {ν -> 1/2, h0 -> 1, h -> 3, t0 -> 1/5, up -> 1/5, y -> 1/3, t -> 5};

ref = NResidue[u /. para2, {s, 0}];
rst1 = N[resAna /. para2];
rst2 = N[resAnaTrue /. para2];
ref - rst1
(* -0.653061 + 1.22133*10^-13 I *)
ref - rst2
(* 9.76996*10^-15 + 1.22133*10^-13 I *)

Apparently the formula in the paper is wrong.


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...