如何在solve_ivp中求解器的时间间隔内的某个点更改变量的值

计算科学 Python scipy
2021-12-26 00:36:17

下面的代码用 求解一个微分方程scipy

import numpy as np
from scipy.integrate import solve_ivp

t0 = 0
Z0 = np.array([0, 0, 0, 0])
sw = 0
t_final = .001
t, z = t0, Z0
if sw == 0:
    sol = solve_ivp(f0, [t,t_final], z, method='BDF', events=g0)
    Z = sol.y.T
    t, z = sol.t[-1], Z[-1]
else:
    sol = solve_ivp(f1, [t,t_final], z, method='BDF', events=g1)

其中f0f1是以下函数:

def f0(t, Z):
    U = np.array([[vin], [vdon]])
    Zdot = A*Z + B*U
    return Zdot

def f1(t, Z):
    U = np.array([[vin], [vdon]])
    Zdot = R*Z + S*U
    return Zdot

在区间[t0,t_final](即[0,.001])中,我想将 in 的值更改为vinatU = np.array([[vin], [vdon]])t=.0005以后。准确地说,对于 times [.0005,.001],我想为vin. 我该怎么做呢?

1个回答

可能有几种方法可以做到这一点,但一个简单的解决方案是定义f0(and f1) 以便vin取决于t. 例如,

def f0(t, Z):
    vin = vin_1 if t < 0.0005 else vin_2
    U = np.array([[vin], [vdon]])
    return A*Z + B*U

您必须在其他地方进行定义vin_1vin_2但这应该可以。实际上,vin可以是 的函数t,如果您愿意,它可以让您在整个集成过程中逐渐更改 的值。vin例子:

vin = lambda t: t*(1 - t)

def f0(t, Z):
    U = np.array([[vin(t)], [vdon]])
    return A*Z + B*U