Skip to main content

calculus and analysis - How to make an organised investigation of branch cuts from a solution to a differential equation


I am attempting to solve two differential equations. The solution gives equations that have branch cuts. I need to choose appropriate branch cuts for my boundary conditions. How do I find the correct ones?



The differential equations and the boundary conditions are


ClearAll[a, b, x, ω, ν, U];
eqns = {
ω b[x] - ν (a'')[x] == 0,
U ω - ω a[x] - ν (b'')[x] == 0
};
bc1 = {a[0] == 0, b[0] == 0};
bc2 = {a[∞] == U, b[∞] == 0};

The boundary condition bc2 is ambitions and does not work if put into DSolve. However, with just boundary condition bc1 we can get a solution.



sol = {a[x], b[x]} /. 
DSolve[Join[eqns, bc1], {a[x], b[x]}, {x, 0, ∞}]

The solution is long and contains terms like (-1)^(3/4) which suggests four branch cuts. There are also constants of integration C[2] and C[4]. By playing around I find I can get a tidy solution by making substitutions and simplifying. I have replace C[2] with a normalised c[2] and similar for C[4]. I have replaced x with a normalised η I don't think I have significantly changed the problem.


subs = { x -> η /Sqrt[2] Sqrt[ν]/Sqrt[ω], 
C[2] -> U Sqrt[2] Sqrt[ω]/Sqrt[ν] c[2],
C[4] -> U Sqrt[2] Sqrt[ω]/Sqrt[ν] c[4]};
sol1 = Simplify[First@sol /. subs]

The solution is



{1/4 E^((-(1/2) - I/2) η)
U (-1 + 4 E^((1/2 + I/2) η) - (1 - I) c[2] +
E^((1 + I) η) (-1 + (1 - I) c[2] - (1 + I) c[4]) +
E^η (-1 + (1 + I) c[2] - (1 - I) c[4]) -
E^(I η) (1 + (1 + I) c[2] - (1 - I) c[4]) + (1 + I) c[4]),
1/4 E^((-(1/2) - I/2) η)
U (-I - (1 + I) c[2] +
I E^(I η) (1 + (1 + I) c[2] - (1 - I) c[4]) - (1 - I) c[4] +
E^((1 + I) η) (-I + (1 + I) c[2] + (1 - I) c[4]) +
E^η (I + (1 - I) c[2] + (1 + I) c[4]))}


We now have several exponential terms and we can collect them as follows


cc = Collect[sol1, {U, E^_}, Simplify]


{U (1 + 1/
4 E^((1/2 + I/2) η) (-1 + (1 - I) c[2] - (1 + I) c[4]) +
1/4 E^((1/2 - I/2) η) (-1 + (1 + I) c[2] - (1 - I) c[4]) +
1/4 E^((-(1/2) + I/
2) η) (-1 - (1 + I) c[2] + (1 - I) c[4]) +

1/4 E^((-(1/2) - I/2) η) (-1 - (1 - I) c[2] + (1 + I) c[4])),
U (1/4 E^((-(1/2) - I/
2) η) (-I - (1 + I) c[2] - (1 - I) c[4]) +
1/4 I E^((-(1/2) + I/
2) η) (1 + (1 + I) c[2] - (1 - I) c[4]) +
1/4 E^((1/2 + I/2) η) (-I + (1 + I) c[2] + (1 - I) c[4]) +
1/4 E^((1/2 - I/2) η) (I + (1 - I) c[2] + (1 + I) c[4]))}

The first solution should go to U and the second to 0 for large η . I can see I have positive and negative real parts to the exponential powers. Here is where I get lost. How can I choose values for c[2] and c[4] to give me the solutions I need? Note that the solutions I need will make the solution for a go to U and the solution for b go to 0 as x -> Infinity.


Thanks



Edit


xzczd has come up with a solution that is only a few lines long. That is probably the way to go. His/Her method starts afresh and uses the sine transform which suppresses growing solutions. This got me thinking about Laplace transforms and as xzczd states we can't use them directly because they don't allow for boundary conditions at infinity. However, we can use them on the solution I obtained and then remove those parts of the solutions that are exponentially growing. Thus we take the Laplace transform of the solutions.


lapT = LaplaceTransform[cc, η, s] // FullSimplify

{(U (1 + 4 s^3 c[2] + 2 s c[4]))/(s + 4 s^5),
(2 U (s - c[2] + 2 s^2 c[4]))/(1 + 4 s^4)}

which are simple solutions. Now we have to find the roots of the denominators and identify which have real parts greater than zero. These roots will give rise to exponentially growing terms.


rts = Union[Flatten[s /. Solve[Denominator[#] == 0, s] & /@ lapT]]
rtsp = Select[rts, Re[#] > 0 &]


{0, -((-1)^(1/4)/Sqrt[2]), (-1)^(
1/4)/Sqrt[2], -((-1)^(3/4)/Sqrt[2]), (-1)^(3/4)/Sqrt[2]}

{(-1)^(1/4)/Sqrt[2], -((-1)^(3/4)/Sqrt[2])}

The residues of the terms with unwanted roots must be set to zero. We can find the residues and set them to zero as follows.


res = Flatten@
Table[Residue[lapT[[n]], {s, #1}] == 0 & /@ rtsp, {n, Length@lapT}]


This gives rise to four equations in our two unknowns c[2] and c[4]. I was slightly worried by this but we get two solutions easily. (There must be repeated equations that Mthematica can deal with.)


solc = Solve[res, {c[2], c[4]}] // Simplify

{{c[2] -> 1/2, c[4] -> -(1/2)}}

Which is a pleasingly simple result. The inverse transform gives the solution to the differential equations.


InverseLaplaceTransform[ lapT /. First@solc, 
s, η] // FullSimplify

{U - E^(-η/2) U Cos[η/2], -E^(-η/2) U Sin[η/2]}


This may be useful but is messy. If anyone is interested in this method I will post it as an answer with more detail. I can't at the moment due to workload but let me know.




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-...