Wolfram mathematica Mathematica中非线性常微分方程的初始条件

Wolfram mathematica Mathematica中非线性常微分方程的初始条件,wolfram-mathematica,ode,Wolfram Mathematica,Ode,我试图使用Mathematica的NDSolve[]来计算沿球体的测地线,使用耦合ODE: x" - (x" . x) x = 0 问题是我只能输入x(0)和x'(0)的初始条件,解算器对x“=0的解很满意。问题是我在球体上的测地线具有初始条件x”(0)=-x(0),我不知道如何告诉mathematica。如果我把它作为一个条件添加,它会说我正在将True添加到条件列表中 这是我的密码: s1 = NDSolve[{x1''[t] - (x1[t] * x1''[t] + x2[t] * x2

我试图使用Mathematica的NDSolve[]来计算沿球体的测地线,使用耦合ODE:

x" - (x" . x) x = 0
问题是我只能输入x(0)和x'(0)的初始条件,解算器对x“=0的解很满意。问题是我在球体上的测地线具有初始条件x”(0)=-x(0),我不知道如何告诉mathematica。如果我把它作为一个条件添加,它会说我正在将True添加到条件列表中

这是我的密码:

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]]
我想修改它,使初始加速度不是零而是
-x(0)


谢谢,正如错误消息所说--NDSolve只接受阶导数的初始条件,这些阶导数严格小于ODE中出现的最大阶数。
我觉得这更像是一个数学问题。从数学上讲,
{x'[0]=-x0,x[0]==x0}
并没有定义一个唯一的解决方案-您必须按照
{x0.x'[0]=-1,x[0]==x0,x'[0]-x0.x'[0]==v0}
的思路来做一些事情才能解决这个问题(NDSolve仍然会以同样的错误失败)。你知道你会在单位球面上得到一个大圆,对吗

顺便说一下,下面是我将如何编写您的示例:

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}]

嗯,正如错误消息所说--NDSolve只接受严格小于ODE中出现的最大阶数的阶导数的初始条件。
我觉得这更像是一个数学问题。从数学上讲,
{x'[0]=-x0,x[0]==x0}
并没有定义一个唯一的解决方案-您必须按照
{x0.x'[0]=-1,x[0]==x0,x'[0]-x0.x'[0]==v0}
的思路来做一些事情才能解决这个问题(NDSolve仍然会以同样的错误失败)。你知道你会在单位球面上得到一个大圆,对吗

顺便说一下,下面是我将如何编写您的示例:

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}]

我通过数学上的重新安排解决了这个问题,而不是解决我原来的问题:

设V(t)是沿x(t)方向的向量场

x。V=0意味着d/dt(x.V)=(x'.V)+(x.V')=0

所以方程D/dtv=V'-(x.V')x=V'+(x'.V)x成立 这意味着测地线方程变为:x“+(x'.x')x=0,因此可以使用我最初拥有的初始条件来求解


非常感谢Janus指出了我遇到的各种问题,包括糟糕的代码布局,我也从你的重写中学到了很多。

我通过数学重新安排解决了这个问题,而不是解决我原来的问题:

设V(t)是沿x(t)方向的向量场

x.V=0意味着d/dt(x.V)=(x'.V)+(x.V')=0

所以方程D/dtv=V'-(x.V')x=V'+(x'.V)x成立 这意味着测地线方程变为:x“+(x'.x')x=0,因此可以使用我最初拥有的初始条件来求解


非常感谢Janus指出了我遇到的各种问题,包括糟糕的代码布局,我也从你的重新编写中学到了很多。

感谢Janus,我最终尝试的是使用mathematica解决单位球面上的一些微分方程。我认为我应该尝试的最简单的DE是d/dtx'=0,即测地线方程,希望得到一个像你建议的那样的大圆弧:)。在R^n中的球体上,协变导数D/dtv可以由V'-谢谢Janus,我最终要做的是用mathematica在单位球体上解一些微分方程。我认为我应该尝试的最简单的DE是d/dtx'=0,即测地线方程,希望得到一个像你建议的那样的大圆弧:)。在R^n中的球面上,协变导数D/dtv可由V'计算-