Warum wird bei der Verwendung von integrate.odeint in SciPy nicht der Dfunc (gradient) aufgerufen?

8

Kann jemand ein Beispiel für die Bereitstellung eines Jacobibian an eine integrate.odeint -Funktion in SciPy? Ich versuche, diesen Code von SciPy Tutorial Odein Beispiel scheint aber, dass Dfunc (Gradient) nie aufgerufen wird.

%Vor%     
lumartor 08.07.2013, 18:42
quelle

1 Antwort

13

Unter der Haube scipy.integrate.odeint verwendet den LSODA-Löser aus der ODEPACK FORTRAN-Bibliothek . Um mit Situationen fertig zu werden, in denen die zu integrierende Funktion steif ist, wechselt LSODA adaptiv zwischen zwei verschiedene Methoden zur Berechnung der integralen - Adams-Methode , die schneller ist, aber für steife Systeme ungeeignet ist, und BDF , das ist langsamer, aber robust gegen Steifheit.

Die spezielle Funktion, die Sie integrieren möchten, ist nicht steif, daher wird LSODA Adams bei jeder Iteration verwenden. Sie können dies überprüfen, indem Sie infodict ( ...,full_output=True ) und infodict['mused'] zurückgeben.

Da Adams 'Methode die Jacobi-Methode nicht verwendet, wird Ihre Gradientenfunktion nie aufgerufen. Wenn Sie jedoch odeint eine steife Integrationsfunktion zuweisen, wie zum Beispiel die Van der Pol-Gleichung :

%Vor%

Sie sollten sehen, dass odeint auf BDF umschaltet und die Jacobi-Funktion jetzt aufgerufen wird.

Wenn Sie mehr Kontrolle über den Solver haben möchten, sollten Sie sich % co_de ansehen % , das ist eine viel flexiblere objektorientierte Schnittstelle zu mehreren verschiedenen Integratoren.

    
ali_m 09.07.2013, 02:07
quelle

Tags und Links