2010-12-15 13 views
10

Debido a la sintaxis de DSolve, los sistemas de ecuaciones diferenciales deben darse como listas de ecuaciones y no como una ecuación vectorial (a diferencia de Solve, que acepta ambas). Así que mi simple pregunta es cómo convertir una ecuación vectorial como:Conversión de ecuación vectorial a una lista de ecuaciones en Mathematica

{f'[t],g'[t]}=={{a,b},{c,d}}.{f[t],g[t]} 

Para lista de ecuaciones:

{f'[t]==a*f[t]+b*g[t],g'[t]==c*f[t]+d*g[t]} 

Creo que sabía una vez que la respuesta, pero no puedo encontrar ahora y creo que podría beneficiar a otros también.

Respuesta

13

Intente utilizar Tema:

Thread[{f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]}] 
(* {f'[t] == a f[t] + b g[t], g'[t] == c f[t] + d g[t] *) 

Se necesita el operador de igualdad == y lo aplica a cada elemento dentro de una lista con el mismo Head.

+0

@ Mike si se va a expandir respuestas viejos, por favor, vea también la adición de enlaces de documentación a las funciones y conceptos relevantes. Por ejemplo, la palabra 'Head' no aparece en ninguna parte del código, y eso podría dejar a alguien adivinando. –

6

La respuesta estándar a esta pregunta es la que se presentó Brett, es decir, utilizando Thread. Sin embargo, me parece que para el uso en DSolve, NDSolve, etc ... el comando LogicalExpand es mejor.

eqn = {f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]}; 

LogicalExpand[eqn] 

(* f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *) 

No convierte una ecuación vectorial a una lista, pero es más útil, ya que se aplana automáticamente fuera de la matriz ecuaciones/tensor y combinaciones de ecuaciones vectoriales. Por ejemplo, si desea añadir las condiciones iniciales para la ecuación diferencial anterior, tendrá que utilizar

init = {f[0], g[0]} == {f0, g0}; 

LogicalExpand[eqn && init] 

(* f[0] == f0 && g[0] == g0 && 
    f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *) 

Un ejemplo de una ecuación de matriz es

mEqn = Array[a, {2, 2}] == Partition[Range[4], 2]; 

Usando Thread aquí es torpe, es necesario para aplicarlo varias veces y Flatten el resultado. Usando LogicalExpand es fácil

LogicalExpand[mEqn] 

(* a[1, 1] == 1 && a[1, 2] == 2 && a[2, 1] == 3 && a[2, 2] == 4 *) 
Cuestiones relacionadas