Python 问题理解scipy.integrate.RK45要求
我试图用Python 问题理解scipy.integrate.RK45要求,python,scipy,differential-equations,runge-kutta,Python,Scipy,Differential Equations,Runge Kutta,我试图用scipy.integrate.RK45()解一阶微分方程组。我已经编写了我希望绘制的模型函数(位移与时间),但是RK45()要求该函数接受两个参数,即't'和'y',在我的例子中't'是标量,'y'是数组。下文对此进行了更好的描述: 我的脚本如下: import numpy as np from scipy.integrate import RK45, RK23 # Model the calling function [X_dot]: #---------------------
scipy.integrate.RK45()
解一阶微分方程组。我已经编写了我希望绘制的模型函数(位移与时间),但是RK45()
要求该函数接受两个参数,即't'和'y',在我的例子中't'是标量,'y'是数组。下文对此进行了更好的描述:
我的脚本如下:
import numpy as np
from scipy.integrate import RK45, RK23
# Model the calling function [X_dot]:
#------------------------------------------------------------------
def model(t, y):
# Define the mass, stiffness and damping [m, c, k]:
m = 2
c = 10
k = 1500
# Define the piecewise forcing function [F]:
if (t >= 0 and t < 0.1):
F = 200 * t
if (t >= 0.1 and t < 0.25):
F = 20
else:
F = 0
E_matrix = [[0, 1], [(-k / m), (-c / m)]]
Q_matrix = [0, F / m]
return E_matrix*X + Q_matrix
# Define the initial conditions and integration boundaries:
#------------------------------------------------------------------
time_step = 0.01
t_upper = 0.5
t_lower = 0
initial_conditions = [0, 0] # [displacement(t=0) = 0, velocity(t=0) = 0]
points_to_plot = RK45(fun=model(t, y), t0=t_lower, y0=initial_conditions, t_bound=t_upper, vectorized=True)
将numpy导入为np
从scipy.integrate导入RK45、RK23
#为调用函数[X_点]建模:
#------------------------------------------------------------------
def型号(t,y):
#定义质量、刚度和阻尼[m、c、k]:
m=2
c=10
k=1500
#定义分段强制函数[F]:
如果(t>=0且t<0.1):
F=200*t
如果(t>=0.1和t<0.25):
F=20
其他:
F=0
E_矩阵=[[0,1],(-k/m),(-c/m)]]
Q_矩阵=[0,F/m]
返回E_矩阵*X+Q_矩阵
#定义初始条件和集成边界:
#------------------------------------------------------------------
时间步长=0.01
t_上限=0.5
t_下=0
初始条件=[0,0]#[位移(t=0)=0,速度(t=0)=0]
点到点绘图=RK45(fun=模型(t,y),t0=t\u下限,y0=初始条件,t\u边界=t\u上限,矢量化=真)
我想解决的系统图片如下所示:
我发现这方面的例子很少,因为大多数解决方案都使用odeint()
这两个参数(t,y)是什么?如何有效地将它们合并到函数中?非常感谢您的帮助。您已经使用了
t
。现在,将def模型(t,y):
更改为def模型(t,X):
,您也将使用X
。请注意,t和y是位置参数,您可以在函数中随意调用它们。您还有另一个问题,那就是您将Python列表相乘!在Python中,与Matlab相反,您需要指定创建数组:
改变
E_matrix = [[0, 1], [(-k / m), (-c / m)]]
Q_matrix = [0, F / m]
到
及
到
as@
是NumPy中的矩阵积<代码>*执行元素式产品
编辑:我没有发现调用
RK45(fun=model(t,y),
。这样做,你就在t,y
传递函数模型的值。你需要给函数本身:RK45(fun=model,
嗨,Pierre,非常感谢你的帮助!我已经做了相关的更改,但是现在得到了一个错误NameError:name't'没有定义(我以前也得到过)。调用RK45函数时,应该给t和X分配什么?现在我只有RK45(fun=model(t,X)…
作为占位符。我没有发现RK45(fun=model(t,y),
。通过这样做,您在t,y
传递函数model
的值。您需要给出函数本身:RK45(fun=model,
E_matrix = np.array([[0, 1], [(-k / m), (-c / m)]])
Q_matrix = np.array([0, F / m])
return E_matrix*X + Q_matrix
return E_matrix @ X + Q_matrix