Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 问题理解scipy.integrate.RK45要求_Python_Scipy_Differential Equations_Runge Kutta - Fatal编程技术网

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