I have an equation
y''[t] + w^2*Sin[y[t]] == 0
So I'm using DSolve like this:
DSolve[{y''[t] + w^2*Sin[y[t]] == 0, y[0] == yrad, y'[0] == 0}, y[t], t]
Where yrad=Pi/9
I keep getting the ifun
,inex
and bvfail
errors. Can anyone tell me what I'm doing wrong?
Thanks so much
EDIT: Sorry I just realized I left out w=1.4
Answer
Note: This is for V9. DSolve
works in V10
Consider the general solution:
sols = DSolve[{y''[t] + w^2*Sin[y[t]] == 0}, y, t]
Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information. >>
(*
{{y -> Function[{t},
-2 JacobiAmplitude[1/2 Sqrt[(2 w^2 + C[1]) (t + C[2])^2], (4 w^2)/(2 w^2 + C[1])]]},
{y -> Function[{t},
2 JacobiAmplitude[1/2 Sqrt[(2 w^2 + C[1]) (t + C[2])^2], (4 w^2)/(2 w^2 + C[1])]]}}
*)
It's not particularly easy to solve for the coefficients C[1]
and C[2]
for a given IVP. Perhaps you can figure out how to use it, though?
Given concrete numbers for the parameters, values can be found:
cons1 = Block[{w = 1.4},
FindRoot[{y[0] == Pi/9, y'[0] == 0} /. First[sols] /.
Thread[{C[1], C[2]} -> {c1, c2}], {c1, 1}, {c2, 1}]
]
FindRoot::cvmit: Failed to converge to the requested accuracy or precision within 100 iterations. >>
(*
{c1 -> -3.93237 + 3.84299*10^-6 I, c2 -> 0.00280231 + 0.0000103908 I}
*)
Second solution:
cons2 = Block[{w = 1.4},
FindRoot[{y[0] == Pi/9, y'[0] == 0} /. Last[sols] /.
Thread[{C[1], C[2]} -> {c1, c2}], {c1, 1}, {c2, 1}]
]
(*
{c1 -> -3.6836 - 2.3703*10^-16 I, c2 -> 1.1306 + 5.30368*10^-16 I}
*)
We should check the solutions. This is not particularly easy since JacobiAmplitude
won't be easy to simplify symbolically. So let's check it numerically. First the particular solutions produced by the above results of FindRoot
:
sols0 = MapThread[ReplaceAll, {sols, {cons1, cons2}}];
Next, we'll check the residuals of the differential equation and the initial conditions:
Block[{w = 1.4, yrad = Pi/9},
{y''[t] + w^2*Sin[y[t]] == 0, y[0] == yrad, y'[0] == 0} /.
Equal -> Subtract /. sols0 // FullSimplify
] /. t -> RandomReal[1, 10] // Chop
(*
{{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -0.349067 + 0.000311727 I, 0.0000172797 + 0.111239 I},
{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0}}
*)
Clearly the first solution does not satisfy the initial conditions. Therefore only the second solution is valid.
Last[sols0]
(*
{y -> Function[{t},
2 JacobiAmplitude[1/2 Sqrt[(2 w^2 - (3.6836 + 2.02417*10^-17 I)) (t + (1.1306 +
1.24204*10^-16 I))^2], (4 w^2)/(2 w^2 - (3.6836 + 2.02417*10^-17 I))]]}
*)
Note: The hint in one of the error messages suggests trying Reduce
. That may be tried using the following:
Block[{opts, res},
opts = Options[Solve];
SetOptions[Solve, Method -> Reduce];
res = DSolve[{y''[t] + w^2*Sin[y[t]] == 0, y[0] == yrad, y'[0] == 0},
y[t], t];
SetOptions[Solve, opts];
res
]
DSolve::bvimp: General solution contains implicit solutions. In the boundary value problem, these solutions will be ignored, so some of the solutions will be lost. >>
(*
{}
*)
Obviously, it is not successful in this case. By the way, the message here suggested the above method to me. (So the messages, imo, often contain useful hints.)
Comments
Post a Comment