python二阶耦合二阶常微分方程Runge-Kutta四阶

python二阶耦合二阶常微分方程Runge-Kutta四阶,python,ode,runge-kutta,Python,Ode,Runge Kutta,我是python的初学者。我对两个二阶常微分方程有个问题,它们是耦合的。我想用四阶龙格库塔来解它。我已经做了两个矩阵,[A]和[B]表示V'=A*C+B。但是我没有得到答案。有人能帮我吗 这是方程式 方程式 这是我的代码: import numpy as np from math import sqrt from sympy import * import matplotlib.pyplot as plt x,v1, v2, v3, v4, dv1, dv2, dv3, dv4, t =

我是python的初学者。我对两个二阶常微分方程有个问题,它们是耦合的。我想用四阶龙格库塔来解它。我已经做了两个矩阵,[A]和[B]表示V'=A*C+B。但是我没有得到答案。有人能帮我吗

这是方程式

方程式

这是我的代码:

import numpy as np
from math import sqrt

from sympy import *
import matplotlib.pyplot as plt

x,v1, v2, v3, v4, dv1, dv2, dv3, dv4, t = symbols('x v1 v2 v3 v4 dv1 dv2 dv3 dv4 t')
# Parameters
mr = 
m =
c = 
k = 
F =  

# Equations:


A = Matrix([[0, 0, 1, 0], [0, 0, 0, 1], [-k / mr, k / mr, -c / mr, c / mr], [k / m, -k / m, c / m, -c / m]])

B = Matrix([0, 0, 0, -F])

dv1 = diff(v1, t)
dv2 = diff(v2, t)
dv3 = diff(v3, t)
dv4 = diff(v4, t)


C = Matrix([v1,v2,v3,v4])


def V(v1,v2,v3,v4,t):
    V = A*C+B

    return V

def rk4(f, v1, v2, v3 ,v4 , x0 , x1 , n):
    k11 = [0] * (n + 1)
    k21 = [0] * (n + 1)
    k31 = [0] * (n + 1)
    k41 = [0] * (n + 1)
    k12 = [0] * (n + 1)
    k22 = [0] * (n + 1)
    k32 = [0] * (n + 1)
    k42 = [0] * (n + 1)
    k13 = [0] * (n + 1)
    k23 = [0] * (n + 1)
    k33 = [0] * (n + 1)
    k43 = [0] * (n + 1)
    k14 = [0] * (n + 1)
    k24 = [0] * (n + 1)
    k34 = [0] * (n + 1)
    k44 = [0] * (n + 1)


    h = (x1 - x0) / n
    for i in range(1, n + 1):

        k11 = h * f(v1, v2, v3, v4, t)
        k21 = h * f(v1, v2, v3, v4, t)
        k31 = h * f(v1, v2, v3, v4, t)
        k41 = h * f(v1, v2, v3, v4, t)

        k12 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k11)
        k22 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k21)
        k32 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k31)
        k42 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k41)

        k13 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k12)
        k23 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k22)
        k33 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k32)
        k43 = h * f(v1 + 0.5 * h, v2 + 0.5 * h, v3 + 0.5 * h, v4 + 0.5 * h, t + 0.5 * k42)

        k14 = h * f(v1 + h, v2 + h, v3 + h, v4 + h, t + k13)
        k24 = h * f(v1 + h, v2 + h, v3 + h, v4 + h, t + k23)
        k34 = h * f(v1 + h, v2 + h, v3 + h, v4 + h, t + k33)
        k44 = h * f(v1 + h, v2 + h, v3 + h, v4 + h, t + k43)

        t[i] = t + i * h
        jv1[i] = v1 + (k11 + k12 + k12 + k13 + k13 + k14) / 6
        jv2[i] = v2 + (k21 + k22 + k22 + k23 + k23 + k24) / 6
        jv3[i] = v3 + (k31 + k32 + k32 + k33 + k33 + k34) / 6
        jv4[i] = v4 + (k41 + k42 + k42 + k43 + k43 + k44) / 6
    return jv1, jv2 , jv3, jv4


jv1, jv2 , jv3 , jv4  = rk4(V, 0, 0, 1, 1 , 0 , 1 , 10)

plt.plot(jv1, jv2 , jv3 , jv4 , t)
plt.grid('on')
plt.show()

删除未使用的和矛盾的变量和语句,对代码进行精简和更正是非常必要的

import numpy as np
from math import sqrt

import matplotlib.pyplot as plt

# Parameters
mr = 2
m = 1
c = 5
k = 36
F = 3

# Equations:
   
def V(u,t):
    x1, x2, v1, v2 = u
    dx = x2-x1;
    dv = v2-v1;

    return np.array([ v1, v2, (c*dv+k*dx)/mr, -(F+c*dv+k*dx)/m ])

def rk4(f, u0, t0, tf , n):
    t = np.linspace(t0, tf, n+1)
    u = np.array((n+1)*[u0])
    h = t[1]-t[0]
    for i in range(n):
        k1 = h * f(u[i], t[i])    
        k2 = h * f(u[i] + 0.5 * k1, t[i] + 0.5*h)
        k3 = h * f(u[i] + 0.5 * k2, t[i] + 0.5*h)
        k4 = h * f(u[i] + k3, t[i] + h)
        u[i+1] = u[i] + (k1 + 2*(k2 + k3) + k4) / 6
    return u, t


u, t  = rk4(V, np.array([0., 0., 1., 1.]) , 0. , 1. , 10)
x1, x2, v1, v2 = u.T
plt.plot(t, x1, t, x2)
plt.grid('on')
plt.show()

如果这是一个正确的结果,则由您决定。

您能澄清您的问题是什么吗?你说你“得不到答案”,但实际上你并没有说发生了什么。你有例外吗?输出错误?没有输出?您希望输出是什么样的?请添加在数字代码中使用sympy的理由。再次检查RK4的工作原理。决定您是想要基于向量的方法还是基于坐标的方法。目前这是一个无法运行的混合。我在代码中遇到错误,它无法运行。使用rk4函数后会出现大约10个错误。我需要在列表中获得4个变量。我使用sympy,因为我有4个耦合变量,它不能独立求解,所以我有一个矩阵来求解。我想做一个基于向量的方法