Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I want to solve the following equation in mathematica :

DSolve[{X'[t] == A.X[t], X[0] == ( {{0},{0}} )}, X[t], t] It is a system of 2 ODEs coupled by the matrix A, that I don't want to put in the form {{a,b},{c,d}} in order to have the output as a function of matrix exponential.

Mathematica understands that but gives a solution strangely expressed as:

 {{X[t] -> 
 InverseFunction[Dot, 2, 2][A, 
     E^(t A.1)
     InverseFunction[InverseFunction[Dot, 2, 2], 2, 2][A, 0]]}}

Where it indeed uses a matrix exponential, but also relies on a strange notation InverseFunction [...]

My question is how to get rid of this InverseFunction notation to have a more readable expression. Do I for example have a manner to postulate that A is a (2,2) matrix, invertible, with inverse B?

Or more generally, how to solve vectorial ODE's and make Mathematica write the solution by relying on exponential matrix notation?

If I can hope a better result with maxima, please advise. Thanks a lot for help

share|improve this question
4  
Mathematica does not yet support symbolic, non-explicit matrices, so if you don't want to replace your A with something like {{a11, a12}, {a21, a22}}, there's not much you can do... still, look into MatrixExp[]. –  J. M. Aug 3 '12 at 13:06
    
@J.M. And that is a real pity :) –  belisarius Aug 3 '12 at 13:08
    
Thanks a lot JM. I tried that for this equation : Y'=(A-B)Y+B*L, and wrote it as : DSolve[{{{Derivative[1][Y1][t]}, {Derivative[1][Y2][ t]}} == ({{a11, a12}, {a21, a22}} - {{b11, b12}, {b21, b22}}).{{Y1[t]}, {Y2[t]}} + {{b11, b12}, {b21, b22}}.{{L1}, {L2}}, {{Y1[0]}, {Y2[ 0]}} == {{L01}, {L02}}}, {{Y1[t]}, {Y2[t]}}, t] But I got an error message : DSolve::dsfun: "{Y1[t]} cannot be used as a function. " , any idea? –  volatile Aug 3 '12 at 13:19
    
Use Thread on your equations to get the == working on component level. You might need to throw in a Flatten. –  Sjoerd C. de Vries Aug 3 '12 at 13:44
    
I used Thread, DSolve[{Thread[{{Derivative[1][Y1][t]}, {Derivative[1][Y2][ t]}} == {{b11 L1 + b12 L2 + (a11 - b11) Y1[t] + (a12 - b12) Y2[t]}, {b21 L1 + b22 L2 + (a21 - b21) Y1[t] + (a22 - b22) Y2[t]}}], Thread[{{Y1[0]}, {Y2[0]}} == {{L01}, {L02}}]}, {{Y1[t]}, {Y2[t]}}, t]but still have the same error message DSolve::dsfun: "{Y1[t]} cannot be used as a function." –  volatile Aug 3 '12 at 14:15
add comment

1 Answer

Module[{X, A, InitialCondition},
X[t_] = {X1[t], X2[t]};
InitialCondition = {0, 0};
A = {{a, b}, {c, d}};
Flatten@DSolve[{Thread[X'[t] == A.X[t]], Thread[X[0] == InitialCondition]}, 
X[t], t]]

Was what was meant by correct usage of Thread and Level I think. {0,0} is a trivial initial condition but with {1,1} you get:

Module[{X, A, InitialCondition},
X[t_] := {X1[t], X2[t]};
InitialCondition = {1, 1};
A = {{a, b}, {c, d}};
Flatten@DSolve[{Thread[X'[t] == A.X[t]], 
Thread[X[0] == InitialCondition]}, X[t], t] // FullSimplify]

{X1[t] -> (
  E^(1/2 (a + d) t) (Sqrt[4 b c + (a - d)^2]
   Cosh[1/2 Sqrt[4 b c + (a - d)^2] t] + (a + 2 b - d) Sinh[
   1/2 Sqrt[4 b c + (a - d)^2] t]))/Sqrt[4 b c + (a - d)^2], 
 X2[t] -> (
  E^(1/2 (a + d) t) (Sqrt[4 b c + (a - d)^2]
   Cosh[1/2 Sqrt[4 b c + (a - d)^2] t] + (-a + 2 c + d) Sinh[
   1/2 Sqrt[4 b c + (a - d)^2] t]))/Sqrt[4 b c + (a - d)^2]}

which is (as expected) the same as

MatrixExp[{{a, b}, {c, d}} t].{1, 1} // FullSimplify
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.