python解微分方程组 数值_解一个常微分方程组(带变常数!)使用scipy.integrate.odeint?...

是的,这是可能的。在a是常量的情况下,我猜您调用了scipy.integrate.odeint(fun, u0, t, args),其中fun的定义与您的问题相同,u0 = [x0, y0, z0]是初始条件,t是要为ODE求解的时间点序列,args = (a, b, c)是要传递给fun的额外参数。

在a依赖于时间的情况下,您只需重新考虑a作为函数,例如(给定常量a0):def a(t):

return a0 * t

然后,您必须修改fun,它在每个时间步计算导数,以考虑到先前的更改:def fun(u, t, a, b, c):

x = u[0]

y = u[1]

z = u[2]

dx_dt = a(t) * x + y * z # A change on this line: a -> a(t)

dy_dt = b * (y - z)

dz_dt = - x * y + c * y - z

return [dx_dt, dy_dt, dz_dt]

最后,注意u0、t和args保持不变,您可以再次调用scipy.integrate.odeint(fun, u0, t, args)。

关于这种方法的正确性。数值积分近似的性能受到影响,我不知道具体如何影响(没有理论保证),但这里有一个简单的例子:import matplotlib.pyplot as plt

import numpy as np

import scipy as sp

import scipy.integrate

tmax = 10.0

def a(t):

if t < tmax / 2.0:

return ((tmax / 2.0) - t) / (tmax / 2.0)

else:

return 1.0

def func(x, t, a):

return - (x - a(t))

x0 = 0.8

t = np.linspace(0.0, tmax, 1000)

args = (a,)

y = sp.integrate.odeint(func, x0, t, args)

fig = plt.figure()

ax = fig.add_subplot(111)

h1, = ax.plot(t, y)

h2, = ax.plot(t, [a(s) for s in t])

ax.legend([h1, h2], ["y", "a"])

ax.set_xlabel("t")

ax.grid()

plt.show()

我希望这对你有帮助。

你可能感兴趣的:(python解微分方程组,数值)