微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

发出对scipy.integrate.RK45要求的理解

如何解决发出对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)

我想解决的系统图如下所示:

System of DEs

由于大多数解决方案都使用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 举报,一经查实,本站将立刻删除。