当解一个ODEs系统时,Sympy返回“Key Error”

2024-05-20 14:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用初始值解测地线方程:

enter image description here

其中,以上是一个系统的两个颂歌。在代码中,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("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)]

或者,更容易理解:

enter image description here

但在运行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)之间交替。似乎在对代码进行分类时出现了错误,那么这是否意味着sympy无法求解方程?你知道吗


Tags: 代码infordiffrangesincoordssystem
1条回答
网友
1楼 · 发布于 2024-05-20 14:16:36

请检查文档,但我相信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

相关问题 更多 >