Condições iniciais com uma ode não linear em Mathematica
-
28-09-2019 - |
Pergunta
Estou tentando usar o nddsolve da Mathematica [] para calcular um geodésico ao longo de uma esfera usando o ODE acoplado:
x" - (x" . x) x = 0
O problema é que eu só posso inserir as condições iniciais para x (0) e x '(0) e o solucionador está feliz com a solução em que x "= 0. O problema é que meu geodésico na esfera tem a condição inicial de que x "(0) = -x (0), que não tenho idéia de como dizer a Mathematica. Se eu adicionar isso como condição, ele diz que estou adicionando fiel à lista de condições.
Aqui está o meu código:
s1 = NDSolve[{x1''[t] - (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x1[t] == 0, x2''[t] - (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x2[t] == 0, x3''[t] - (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x3[t] == 0, x1[0] == 1, x2[0] == 0, x3[0] == 0, x1'[0] == 0, x2'[0] == 0, x3'[0] == 1} , { x1, x2, x3}, {t, -1, 1}][[1]]
Eu gostaria de modificar isso para que a aceleração inicial não seja zero, mas -x(0)
.
Obrigado
Solução 2
Corrigi esse problema através de um rearranjo matemático, em vez de abordar meu problema original:
Seja v (t) um campo vetorial ao longo de x (t).
x. V = 0 implica d/dt (x. V) = (x '. V) + (x. V') = 0
Portanto, a equação d/dt v = v ' - (x. V') x = v ' + (x'. V) x mantém isso significa que a equação geodésica se torna: x " + (x '. X') x = 0 E assim pode ser resolvido usando as condições iniciais que tive originalmente.
Muito obrigado Janus por passar e apontar os vários problemas que eu estava tendo, incluindo o horrível layout de código, aprendi muito com sua reescrita também.
Outras dicas
Bem, como diz a mensagem de erro - o NDSOLVE aceita apenas condições iniciais para derivados de ordens estritamente menos do que a ordem máxima que aparece na ODE.
Tenho a sensação de que isso é mais uma questão de matemática. Matematicamente, {x''[0]=-x0, x[0]==x0}
, não define uma solução única - você teria que fazer algo como {x0.x''[0]==-1, x[0]==x0, x'[0]-x0 x0.x'[0]==v0}
Para que isso funcione (o NDSOLVE ainda falharia com o mesmo erro). Você percebe que terá um ótimo círculo na esfera da unidade, certo?
A propósito, aqui está como eu teria codificado seu exemplo:
x[t_] = Table[Subscript[x, j][t], {j, 3}];
s1 = NDSolve[Flatten[Thread /@ #] &@{
x''[t] - (x''[t].x[t]) x[t] == {0, 0, 0},
x[0] == {1, 0, 0},
x'[0] == {0, 0, 1}
}, x[t], {t, -1, 1}]