Python 为什么不是';在SciPy中使用integrate.odeint时调用Dfun(gradient)吗?
任何人都可以提供一个例子,为SciPy中的Python 为什么不是';在SciPy中使用integrate.odeint时调用Dfun(gradient)吗?,python,scipy,odeint,Python,Scipy,Odeint,任何人都可以提供一个例子,为SciPy中的integrate.odeint函数提供雅可比矩阵吗?。 我试图从SciPy教程中运行此代码,但似乎从未调用Dfun()(雅可比函数) from numpy import * # added from scipy.integrate import odeint from scipy.special import gamma, airy y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0) y0_0 = -1.0/3**(1.0/3
integrate.odeint
函数提供雅可比矩阵吗?。
我试图从SciPy教程中运行此代码,但似乎从未调用Dfun()
(雅可比函数)
from numpy import * # added
from scipy.integrate import odeint
from scipy.special import gamma, airy
y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
y0_0 = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
y0 = [y0_0, y1_0]
def func(y, t):
return [t*y[1],y[0]]
def gradient(y,t):
print 'jacobian' # added
return [[0,t],[1,0]]
x = arange(0,4.0, 0.01)
t = x
ychk = airy(x)[0]
y = odeint(func, y0, t)
y2 = odeint(func, y0, t, Dfun=gradient)
print y2 # added
在引擎盖下,使用来自的LSODA解算器。为了处理您尝试积分的函数为的情况,LSODA在两种不同的积分计算方法之间自适应切换,这两种方法更快,但不适用于刚性系统,并且速度较慢,但对刚性具有鲁棒性
您试图集成的特定函数是非刚性的,因此LSODA将在每次迭代中使用Adams。您可以通过返回infodict
(..,full\u output=True
)并检查infodict['mused']
来检查这一点
因为亚当斯的方法不使用雅可比矩阵,所以你的梯度函数永远不会被调用。但是,如果给odeint
一个刚性函数进行积分,例如:
您应该看到,odeint
切换到使用BDF,现在可以调用雅可比函数
如果你想对解算器有更多的控制,你应该研究它,它是一个面向多个不同积分器的更灵活的面向对象接口。Perfect。比SciPy文档更清晰。这正是我想要的,谢谢阿里!
def vanderpol(y, t, mu=1000.):
return [y[1], mu*(1. - y[0]**2)*y[1] - y[0]]
def vanderpol_jac(y, t, mu=1000.):
return [[0, 1], [-2*y[0]*y[1]*mu - 1, mu*(1 - y[0]**2)]]
y0 = [2, 0]
t = arange(0, 5000, 1)
y,info = odeint(vanderpol, y0, t, Dfun=vanderpol_jac, full_output=True)
print info['mused'] # method used (1=adams, 2=bdf)
print info['nje'] # cumulative number of jacobian evaluations
plot(t, y[:,0])