如何解决发出对scipy.integrate.RK45要求的理解
我正在尝试用scipy.integrate.RK45()
解一阶微分方程组。我已经编写了我希望绘制的模型函数的脚本(位移与时间),但是RK45()
要求此函数接受2个参数,即't'和'y',其中't'是标量,在我的情况下,“ y”是一个数组。这在下面有更好的描述:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.RK45.html
我的脚本如下:
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)
我想解决的系统图如下所示:
由于大多数解决方案都使用odeint()
,因此我发现很少使用这种方法。
这两个参数(t,y)是什么,我如何将它们有效地合并到我的函数中?任何帮助都将不胜感激。
解决方法
您已经使用了t
。现在,将def model(t,y):
更改为def model(t,X):
,您还将使用X
。请注意,t和y是位置参数,可以根据需要在函数中调用它们。您还有另一个问题,那就是您要乘以Python列表!与Matlab相比,在Python中,您需要指定要创建一个数组:
更改
E_matrix = [[0,1],[(-k / m),(-c / m)]]
Q_matrix = [0,F / m]
到
E_matrix = np.array([[0,(-c / m)]])
Q_matrix = np.array([0,F / m])
和
return E_matrix*X + Q_matrix
到
return E_matrix @ X + Q_matrix
因为@
是NumPy中的矩阵乘积。 *
执行逐元素乘积。
编辑:我没有发现呼叫RK45(fun=model(t,y),
。这样,您将在t,y
传递函数模型的值。您需要提供函数本身:RK45(fun=model,...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。