集成.solve_ivp 被窃听

计算科学
2021-12-22 08:00:04

我正在尝试使用 solve_ivp 解决 ODE,但我遇到了奇怪的错误。文档:https ://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html

from scipy.integrate import solve_ivp as solve
import numpy as np
import matplotlib.pyplot as plt

def fun(t, y, beta, eps):
    u = 1/eps * (-1/3 * y[0]**3 + y[0] + y[1])
    v = beta - y[0]
    y[0]= u
    y[1]= v

    return y

eps = 0.05
beta = 1.1
y0 = np.array([2, 2])
t = np.linspace(0, 1000, num=10000)
Y = solve(fun=lambda t, y: fun(t, y, beta, eps), t_span=(t[0],t[-1]), y0=y0 , method='RK45', t_eval=[1,2,3,4]).y

ValueError:需要至少一个数组来连接

请注意,我已经不得不偏离文档,因为args参数也不起作用。相反,我不得不重新定义我的函数,该函数使用 lambda 方法获取 2 个附加参数。我在这里找到了这个:https ://stackoverflow.com/questions/48245765/pass-args-for-solve-ivp-new-scipy-ode-api

我做错了什么还是这种方法非常错误?

1个回答

您的问题是您正在修改y您的功能。如果您返回,[u,v]而不是重置 中的值y,它似乎运行得很好。我相信这是因为求解器将在其他地方存储和使用中间值,但是您的函数具有更改这些存储值的副作用。