python - scipy.integrate.odeint 返回错误结果
python - scipy.integrate.odeint returning wrong results
我试图使用 python 3.5 和 scipy.integrate.odeint
函数对方波进行积分,但结果没有任何意义,并且随着所选时间点的排列而变化很大。
方波周期为10秒,仿真运行100秒。由于时间点数组的大小为 500,方波的每个周期将有 50 个时间点,但这似乎并没有发生。
使用可选参数 hmax=0.02
修复它,但它不应该自动推断吗?
代码如下:
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate
# dx/dt = f(t), where f(t) is a square wave
def f(x, t):
return float(t % 10.0 < 5.0) * 0.3
T = 100
tt = np.linspace(0, T, 500)
xx = integrate.odeint(f, 0, tt, hmax=0.2)
plt.figure()
plt.subplot(2,1,1)
plt.plot(tt, xx)
plt.axis([0,T,0,16])
plt.subplot(2,1,2)
plt.plot(tt, [f(None,t) for t in tt])
plt.axis([0, T, 0, 1])
plt.show()
我希望有人能对这里发生的事情有所了解。
尝试在 80 和 100(模拟时间)之间更改 T
。
我认为你的问题是 odeint 函数采用连续的常微分方程,而方波不是。
我首先将方波函数重新定义为:
def g(t):
return float(t % 10.0 < 5.0) * 0.3
然后定义一个函数一步步计算积分:
def get_integral(tt):
intarray = np.zeros_like(tt)
step_size = tt[1] -tt[0]
for i,t in enumerate(tt):
intarray[i] = intarray[i-1] + g(t)*step_size
return intarray
然后:
xx = get_integral(tt)
应该会给你想要的结果。
我试图使用 python 3.5 和 scipy.integrate.odeint
函数对方波进行积分,但结果没有任何意义,并且随着所选时间点的排列而变化很大。
方波周期为10秒,仿真运行100秒。由于时间点数组的大小为 500,方波的每个周期将有 50 个时间点,但这似乎并没有发生。
使用可选参数 hmax=0.02
修复它,但它不应该自动推断吗?
代码如下:
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate
# dx/dt = f(t), where f(t) is a square wave
def f(x, t):
return float(t % 10.0 < 5.0) * 0.3
T = 100
tt = np.linspace(0, T, 500)
xx = integrate.odeint(f, 0, tt, hmax=0.2)
plt.figure()
plt.subplot(2,1,1)
plt.plot(tt, xx)
plt.axis([0,T,0,16])
plt.subplot(2,1,2)
plt.plot(tt, [f(None,t) for t in tt])
plt.axis([0, T, 0, 1])
plt.show()
我希望有人能对这里发生的事情有所了解。
尝试在 80 和 100(模拟时间)之间更改 T
。
我认为你的问题是 odeint 函数采用连续的常微分方程,而方波不是。
我首先将方波函数重新定义为:
def g(t):
return float(t % 10.0 < 5.0) * 0.3
然后定义一个函数一步步计算积分:
def get_integral(tt):
intarray = np.zeros_like(tt)
step_size = tt[1] -tt[0]
for i,t in enumerate(tt):
intarray[i] = intarray[i-1] + g(t)*step_size
return intarray
然后:
xx = get_integral(tt)
应该会给你想要的结果。