Berechnung der Jacobi-matrix in C++ (symbolische Mathematik)

Einführung

Nehmen wir mal an, ich muss die Jacobi-matrix für die folgenden ODE:

dxdt[ 0 ] = -90.0 * x[0] - 50.0 * x[1];
dxdt[ 1 ] = x[0] + 3*x[1];
dxdt[ 2 ] = x[1] + 50*x[2];

In Matlab/Octave das wäre ziemlich einfach:

syms x0 x1 x2;
f = [-90.0*x0-50.0*x1, x0+3*x1, x1+50*x2]
v=[x0, x1, x2]
fp = jacobian(f,v)

Dies würde die Ergebnisse mit folgenden Ausgangs-matrix:

[-90  -50  0 ]
[ 1    3   0 ]
[ 0    1   50]

, Was ich brauche

Will ich jetzt reproduzieren die gleichen Ergebnisse in C++. Ich kann nicht berechnen Sie die Jacobi-vor-und hard-code, es wird davon abhängen, z.B. von Benutzereingaben und Zeit. Also meine Frage ist: Wie mache ich das? In der Regel für die Mathematik, operations, nutze ich die Boost Bibliothek, aber in diesem Fall ich finde keine Lösung. Es gibt nur die kurze Notiz über diese in implizite Systeme, aber der folgende code funktioniert nicht:

sys.second( x , jacobi , t )

Er fordert ferner die Zeit (t), so ist es wahrscheinlich auch nicht erzeugen eine analytische form der Lösung. Ich missverstehen die Dokumentationen? Oder sollte ich eine andere Funktion? Ich würde es vorziehen, zu bleiben, in Boost, da Brauch ich das Jacobi-als ublas::matrix und ich möchte vermeiden, Konvertierung.

EDIT:

Spezifischere ich benutze die Jacobi-innen rosenbrock4 ODE-solver. Beispiel hier – Zeilen 47-52. Ich brauche die automatische Generierung dieser Struktur als die ODE-set kann später geändert werden und ich möchte vermeiden, manuell umschreiben Jacobi immer Zeit. Auch einige Variablen innerhalb ODE Definitionen sind nicht konstant in der Zeit.

InformationsquelleAutor Karls | 2017-09-16



2 Replies
  1. 2

    Die Jacobi-basiert auf Ableitungen der Funktion. Wenn die Funktion f ist nur bekannt, zur Laufzeit (und es gibt keine Einschränkungen wie z.B. Linearität), müssen Sie automatisieren die Differenzierung. Wenn Sie wollen, dass dies passiert genau (im Gegensatz zu einer numerischen Schätzung), die Sie verwenden müssen symbolische Berechnung. Schauen Sie zum Beispiel hier und hier für Bibliotheken unterstützt.

    Beachten Sie, dass die Jacobi-in der Regel hängt von dem Zustand und der Zeit, so dass es unmöglich ist, Sie zu vertreten, da eine Konstante matrix (wie in deinem Beispiel), es sei denn, dein problem ist so langweilig, dass man es lösen kann analytisch sowieso.

    • Ja, es werden nicht-Konstante matrix, aber ich dachte, ich kann einige Variablen in meinem Programm-update. Ich brauche Jacobi für ODE-solver, der Blick für exampel hier: link. In den Zeilen 47-52 ist die Jacobi-Struktur-definition. Wie ich schon kompliziert ODE und vielleicht werde ich es später ändern, ich brauche die automatische Generierung dieser. Welche Methode würden Sie empfehlen, für dieses spezielle problem? Ich bearbeitete auch die Frage genauer zu sein.
    • Methode würden Sie empfehlen, für dieses spezielle problem? – Das ist wirklich schwer zu sagen und ist stark davon abhängig, wo deine Prioritäten sind (Laufzeit, usability, etc.). Wenn Sie wollen maximale Effizienz, die Sie brauchen, code-Routinen schreiben oder meta-Programmierung. (Wenn Sie nicht fixiert auf C++, möchten Sie vielleicht werfen Sie einen Blick auf das Python-Modul von mir.)
    • Ich bin fixiert auf c++ ist das mal so, danke für dein Modul, aber ich kann es nicht verwenden, hier. Ich bin fokussiert auf machen funktioniert es zunächst so, jetzt habe ich keine funktionierende Lösung. Ich brauche die Jacobi-generating Algorithmus für rosenbrock4 ODE-solver. Ich denke, es muss “ ready-to-use-Lösung, wie etwa in MATLAB, anstatt manuell schreiben eine andere Lösung-Methode.
  2. 2

    Ich weiß, das ist lange nach der Tat, aber ich habe vor kurzem das wollen, das gleiche zu tun, und begegnet vielen automatischen differentiation (AD) – Bibliotheken, die dies tun, ziemlich gut. Ich habe meistens mit Eigen ist, AD, weil ich bin schon mit Eigen überall. Hier ist ein Beispiel, wie Sie verwenden können, Eigen ist, AD, um die Jacobi-wie Sie gefragt.

    Es gibt auch eine lange Liste von c++ AD-Bibliotheken auf autodiff.org.

    Hoffe, das jemand hilft!

    • Ist das nicht AD komplizierter als numerische Lösung? Ich habe versucht, verwenden Sie die Jacobi-to-speed-up numerische Methode und ich habe Angst, dass es könnte einen Konflikt. Ich bin nicht vertraut mit diesem tool. Und, wie bekannt, aus denen sich die änderung auf die Jacobi in der Zeit? Wenn ich neu berechnen, es manuell jedes mal, es kann langsamer sein als meine bisherige Methode ohne Jacobi. Oder vielleicht ist es möglich, integrieren sowohl die Jacobi-und die ODE zu lösen, in einer Bibliothek zu automatisieren?
    • Die Geschwindigkeit sollte nicht ein Faktor sein, der Vorteil der AD ist, dass Sie die Jacobi-kostenlos nach dem berechnen der Funktion. Lesen Sie mehr in wie das geschieht, mit dual-zahlen, etc.. aber ich glaube nicht, dass Geschwindigkeit ein Thema. Aus dem Beispiel, das Sie geschrieben, wie es scheint, AD wäre sehr einfach zu implementieren, weil die meisten AD-Bibliotheken, die ich gesehen haben, verwenden funktoren, wie Sie bereits in Ihrem Beispiel. Ihr Funktor würde einfach nur die Rückkehr des ode-Ausgang und ANZEIGE gibt Ihnen die jac
    • können Sie sich mich ein Beispiel, wie dies zu tun? Basierend auf den Informationen, die Sie zur Verfügung gestellt, so weit bin ich nicht in der Lage zu finden, wie die Verbindung dieser zwei Teile von meinem code. Wie Sie sehen können basierend auf meinen Matlab-Beispiel, ich bin näher an Wissenschaftler als echter Programmierer.
    • Hier ist ein Beispiel für die Verwendung eines AD-Bibliothek, die ich haben dazu beigetragen, die Entwicklung ein wenig. Es ist gebaut, um die Eigen AD. test hier mit AD zur Berechnung des jacobians und miteinander vergleicht analytische jacobians. Wenn dies ist nicht, was Sie versuchen zu tun, vielleicht bin ich Missverständnis.
    • Ich muss ihn integrieren, mit ODE-solver, also statische Jacobi für t=0 wird nicht helfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.