2012-04-11 10 views
3

gibt es einige Beispiele für die Verwendung arbitrary precision und matrices in boost.odeint (Boost gewöhnliche Differentialgleichung Löser).Anforderungen für beliebige Typen in boost.odeint

Ich möchte Odein Atome in verschiedenen Arten von Koordinaten (Cartesian, polar oder Aktion-Winkel) verwenden.

Welche Operationen sollte ich für Atome überladen? +, -, min, max, pow?

In welcher Datei kann ich nachschlagen, welche Operationen Odeint verwendet?

Update (1) von default algebra, es sieht aus wie es "+", "*" und abs braucht(), max()

+1

Ich verstehe nicht vollständig. Wenn Sie eine Koordinatentransformation durchführen wollen, brauchen Sie keine neuen Typen, da die Gleichungen transformiert werden. Ist Ihre Frage eine: "Mit Odeint möchte ich meinen eigenen Zustandstyp verwenden. Was ist die minimale Menge von Operationen, die mein Zustandstyp unterstützen muss?" –

+0

@ AndréBergner, ja, du hast Recht. –

Antwort

5

Sorry für eine ziemlich lange Antwort, aber ich hatte das Gefühl, dass eine Art Klärung hilfreich wäre:

Im Allgemeinen gibt es zwei Möglichkeiten, Arten in Odein zu spezialisieren.

Eine Möglichkeit ist spezialisiert algebras die Anpassung gedacht werden, um, wie man iteriert über einen Behälter oder eine Sammlung, wie ein std::vector, std::array, ublas::matrix usw. odeint einige vordefinierte Algebra existiert:

  • range_algebra, die mit Arbeiten alle Behälter einer Reihe von Konzept boost.range
  • fusion_algebra zur Kompilierzeit-Sequenzen
  • vector_space_algebra erfüllen, die die Iteration auf die Operationen steuert.
  • thrust_algebra für die Verwendung mit Schub - ein STL-ähnlichen Rahmen für CUDA

Die zweite Möglichkeit für spezielle Typen sind die Operationen anzupassen, die Sie gedacht, damit festlegen, wie die grundlegenden Operationen auf den Elementen durchzuführen des Behälters. Hier gibt es einige vordefinierte Operationen

  • default_operations die Arbeit auf den meisten Typen wie double, float, std::complex<>, ... default_operations nur annehmen, dass die Operatoren +, -, *,/sind sowie die Grundfunktionen definiert wie abs, max.
  • thrust_operation für den Einsatz mit Druck

Wenn ich verstehe Ihre Frage richtig, Sie haben einen oder mehrere Typen für die Punkte mit in verschiedenen Koordinatensystemen leben können und deshalb die Betreiber auf diese Art mit der Arbeit zu übernehmen ist Odeint. In diesem Fall können Sie die range_algebra in Kombination mit den 'default_operations' verwenden: Sagen Sie, Ihr Typ heißt point_type und besteht im Wesentlichen aus Doppelpunkten, dem Haupt-Gleitkommatyp.Um den 'default_operations' zu arbeiten müssen Sie

  • point_type operator+(point_type , double);
  • point_type operator+(double , point_type);
  • point_type operator+(point_type , point_type);
  • point_type operator*(point_type , double);
  • point_type operator*(double , point_type);
  • point_type operator/(point_type , double);
  • double abs(point_type);

Ich denke, das ist alles was benötigt wird. Dann sollten Sie in der Lage sein, Ihre POINT_TYPE in Behältern zu verwenden, wie vector, array, etc. Es ist auch ein Beispiel in odeint, das zeigt, wie spezielle Punkttypen anpassen: solar system mit point types. Es ist ziemlich einfach, wenn Sie die Boost.Operators-Bibliothek verwenden.

Edit: einige Fehler behoben.