You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于四阶Runge-Kutta法求解二维数组多谐振子的实现疑问

多粒子非线性摆的RK4数值求解问题

背景

我已经用Python的四阶龙格-库塔(RK4)方法求解了单个非线性摆的微分方程,还成功用该方法求解过由三个联立微分方程构成的自旋系统,但这些案例都是针对单个粒子的。现在需要求解多个无相互作用粒子的相同微分方程,重复编写单粒子代码太繁琐,也没法灵活调整粒子数量。我对NumPy不熟悉,也没时间系统学习它。

单粒子RK4实现代码

微分方程定义

import numpy as np

def f1(t, x, y): return y

def f2(t, x, y): return -k*np.sin(x)

参数与初始值

k = 1.0                      # 系统参数
t, x, y = 0, 8.0*np.pi/9.0, 0       # 初始值(t:时间/秒,x:摆角/弧度,y:角速度/弧度/秒)
h = 0.01                     # 时间步长

RK4循环与数据存储

T, X, Y = [t], [x], [y]          # 存储时间、摆角、角速度的列表

# 迭代计算
for i in range(2000):
    a1 = h * f1(t, x, y)                      
    b1 = h * f2(t, x, y)                      
    a2 = h * f1(t + 0.5*h, x + 0.5*a1, y + 0.5*b1)  
    b2 = h * f2(t + 0.5*h, x + 0.5*a1, y + 0.5*b1)  
    a3 = h * f1(t + 0.5*h, x + 0.5*a2, y + 0.5*b2)  
    b3 = h * f2(t + 0.5*h, x + 0.5*a2, y + 0.5*b2)  
    a4 = h * f1(t + h, x + a3, y + b3)              
    b4 = h * f2(t + h, x + a3, y + b3)              
    x = x + (1/6)*(a1 + 2*a2 + 2*a3 + a4)         # 更新t+h时刻的摆角
    y = y + (1/6)*(b1 + 2*b2 + 2*b3 + b4)         # 更新t+h时刻的角速度
    t = t + h                               # 更新当前时间
    T.append(t)
    X.append(x)
    Y.append(y)

多粒子实现的问题

现在需要处理**1D数组(2个粒子)或2D数组(4个粒子)**的情况,我尝试写了下面的代码,但出现很多错误,不知道循环部分该怎么补充:

# 错误的尝试代码
def f1(t, x[i][j], y[i][j]): return y[i][j]

def f2(t, x[i][j], y[i][j]): return -k*sin(x[i][j])

k = 1.0                      # 参数
t, x[i][j], y[i][j] = 0, 8.0*pi/9.0, 0       # 初始值
h = 0.01                     # t的步长

请问怎么用基础NumPy技术实现多粒子的RK4求解?

内容的提问来源于stack exchange,提问作者QuestionTheAnswer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:58