2013-07-08 8 views
8

कोई भी साइपी में integrate.odeint फ़ंक्शन में जैकोबियन प्रदान करने का उदाहरण प्रदान कर सकता है? मैं इस कोड को SciPy ट्यूटोरियल odeint example से चलाने का प्रयास करता हूं लेकिन ऐसा लगता है कि Dfunc (gradient) कभी नहीं कहा जाता है।साइप्री में integrate.odeint का उपयोग करते समय Dfunc (ढाल) क्यों नहीं कहा जाता है?

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 

उत्तर

13

हुड के अंतर्गत, scipy.integrate.odeintODEPACK FORTRAN library से LSODA solver उपयोग करता है। उन परिस्थितियों से निपटने के लिए जहां आप एकीकृत करने की कोशिश कर रहे हैं, stiff है, एलएसओडीए अभिन्न - Adams' method की गणना के लिए दो अलग-अलग तरीकों के बीच अनुकूली रूप से स्विच करता है, जो कठोर सिस्टम के लिए तेज़ लेकिन अनुपयुक्त है, और BDF, जो धीमा है लेकिन कठोरता के लिए मजबूत है ।

विशेष कार्य जिसे आप एकीकृत करने की कोशिश कर रहे हैं वह गैर-कठोर है, इसलिए एलएसओडीए प्रत्येक पुनरावृत्ति पर एडम्स का उपयोग करेगा। आप इसे infodict (...,full_output=True) लौटकर और infodict['mused'] पर लौटकर देख सकते हैं।

चूंकि एडम्स की विधि जैकोबियन का उपयोग नहीं करती है, इसलिए आपके ढाल समारोह को कभी भी बुलाया नहीं जाता है। लेकिन अगर आप इस तरह के Van der Pol equation के रूप में, odeint देना एकीकृत करने के लिए एक कड़ी समारोह:

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]) 

आप यह देखना चाहिए कि BDF का उपयोग करने के odeint स्विच, और Jacobian समारोह अब कहा जाता हो जाता है।

यदि आप सॉल्वर पर अधिक नियंत्रण चाहते हैं, तो आपको scipy.integrate.ode में देखना चाहिए, जो कई अलग-अलग एकीकृतकर्ताओं के लिए एक अधिक लचीला ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस है।

+0

बिल्कुल सही। SciPy दस्तावेज से अधिक स्पष्ट है। यह वही है जो मैं चाहता हूं, धन्यवाद ali_m! – lumartor

संबंधित मुद्दे

 संबंधित मुद्दे