Python 为什么不是';在SciPy中使用integrate.odeint时调用Dfun(gradient)吗?

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

任何人都可以提供一个例子,为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.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])