Python Sympy returns“;“关键错误”;在求解常微分方程组时
我尝试使用初始值求解测地线方程: 其中,上述是一个由两个ODE组成的系统。在代码中,x1=Python Sympy returns“;“关键错误”;在求解常微分方程组时,python,math,sympy,differential-equations,Python,Math,Sympy,Differential Equations,我尝试使用初始值求解测地线方程: 其中,上述是一个由两个ODE组成的系统。在代码中,x1=T(s)和x2=P(s)和Γabc=Ga(a,b,c) 我的代码如下所示: from gravipy import * from sympy import * def distance(t1,p1,t2,p2): init_printing() R = 1737 dimensions = 2 t,p = symbols("t p") x = Coordinates
T(s)
和x2=P(s)
和Γabc=Ga(a,b,c)
我的代码如下所示:
from gravipy import *
from sympy import *
def distance(t1,p1,t2,p2):
init_printing()
R = 1737
dimensions = 2
t,p = symbols("t p")
x = Coordinates("x",[t,p])
Metric = diag(R**2, R**2*sin(t)**2)
g = MetricTensor("g", x, Metric)
Ga = Christoffel("Ga", g)
T,P = symbols("T P", cls=Function)
s = symbols("s")
ics = {T(1):t1, T(2):t2, P(1):p1, P(2):p2}
system=[]
coords = [T(s),P(s)]
for a in range(dimensions):
eq = coords[a].diff(s,s)
for b in range(dimensions):
for c in range(dimensions):
christ = Ga(a+1,b+1,c+1).replace("t","T(s)")
eq += christ * coords[b].diff(s) * coords[c].diff(s)
system.append(Eq(eq,0))
print(system)
T,P = dsolve(system, [T(s), P(s)], ics=ics)
print(T,P)
coords=[T(s),P(s)]
integral = 0
for mu in range(dimensions):
for nu in range(dimensions):
integral += g(mu,nu).replace("t","T(s)") * coords[mu].diff(s) * coords[nu].diff(s)
print(integrate(sqrt(integral), (s, 1, 2)))
distance(1,1,2,2)
但是,当我运行程序时,它会生成方程组:
[Eq(-3017169*sin(2*T(s))*Derivative(P(s), s)**2/2 + Derivative(T(s), s, s), 0), Eq(3017169*sin(2*T(s))*Derivative(P(s), s)*Derivative(T(s), s) + Derivative(P(s), s, s), 0)]
或者,更通俗地说:
但在运行dsolve()
时失败,错误如下:
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\sympy\solvers\ode.py", line 584, in dsolve
match = classify_sysode(eq, func)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\sympy\solvers\ode.py", line 1377, in classify_sysode
if not order[func]:
KeyError: P(s)
在
p(s)
和T(s)
之间交替。似乎在对ODE进行分类时出现了错误,那么这是否意味着Symphy无法解方程?请查看文档,但我相信dsolve用于使用线性代数和LU分解解方程组
我想你需要一个龙格-库塔五阶积分法-看看ode
有四个耦合的一阶常微分方程:
dM/ds = d^2T/ds^2 = your first equation
dN/ds = d^2P/ds^2 = your second equation
dT/ds = M
dP/ds = N
我认为这些应该是多重的,耦合的,一阶微分方程。ODE解算器可以做到这一点。@duffymo我如何把它们变成一阶微分方程?你的方程链接没有通过。再试一次。