用SciPy数值求解ODE

时间:2015-10-25 18:23:10

标签: python scipy ode differential-equations

我坚持将scipy.integrate.odeint应用于以下非常简单的ODE:

y(t)/dt = y(t) + t^2 and y(0) = 0

SciPy计算的解决方案不正确(很可能是b / c我在这里混淆了一些东西) - 特别是解决方案不符合初始条件。

import numpy as np
import scipy.integrate
import matplotlib.pyplot as plt
import math

# the definition of the ODE equation
def f(y,t): 
    return [t**2 + y[0]]

# computing the solution
ts = np.linspace(-3,3,1000)
res = scipy.integrate.odeint(f, [0], ts)

# the solution computed by WolframAlpha [1]
def y(t):
    return -t**2 - 2*t + 2*math.exp(t) - 2

fig = plt.figure(1, figsize=(8,8))

ax1 = fig.add_subplot(211)
ax1.plot(ts, res[:,0])
ax1.text(0.5, 0.95,'SciPy solution', ha='center', va='top',
         transform = ax1.transAxes)

ax1 = fig.add_subplot(212)
ax1.plot(ts, np.vectorize(y)(ts))
ax1.text(0.5, 0.95,'WolframAlpha solution', ha='center', va='top',
         transform = ax1.transAxes)

plt.show()

1WolframAlpha: "solve dy(t)/dt = t^2 + y(t), y(0) = 0"

enter image description here

哪里是我的错误?

1 个答案:

答案 0 :(得分:5)

你的scipy代码用初始条件y(-3) = 0解决了微分方程,而不是y(0) = 0y0的{​​{1}}参数是odeint参数中第一次给出的值。

在y(0)= 0的区间[-3,3]上解决此问题的一种方法是调用t两次,如下所示:

odeint

创造 plot of solution