-
-
Endlich tut sich wieder etwas bei diesem Projekt. Seit zwei drei
Tagen arbeite ich wieder an der neuen Release, jetzt aber mit dem
Schwerpunkt auf dem symbolischen Teil, der Math.NET Symbolical Library.
Diese Bibliothek wird zusammen mit der auch neuen Math.NET Numerical
Library die alte Math.NET Library ablösen.
Durch die sehr zahlreichen und massiven Änderungen an der
Architektur des symbolischen Teils habe ich mich entschieden, die
Infrastruktur von Grund auf neu zu Strukturieren (wobei zu einem
späteren Zeitpunkt alle die alten bestehenden Operatorklassen ohne viel
Aufwand in die neue Infrastruktur übernommen werden können).
Einige bisher feste Eckpunkte der neuen symbolischen Bibliothek (teilweise geplant, teilweise bereits umgesetzt):
- Vorbereitet für die Übertragung auf Generics, sobald Whidbey kommt
... (wird einiges stark vereinfachen) ... in der Zwischenzeit erkauft
mit einem leichen typisierungsverlust.
- Etwas weniger Abstrakt (so sind z.b. Variablen neu fester im Kern
eingebaut und es muss nicht mehr für jeden neuen Typen auch noch z.b.
einen Zuweisungsoperator geschriebenwerden)
- Hierarchisches Typensystem (wie schon länger angekündigt) erlaubt z.b. das Definieren von Operatoren auf algebraischen Ringen.
- Mengen/Sets - u.a. auch für Domain- und Wertebereich von ausdrücken
- Late Binding für Operatoren, erlaubt auch das Arbeiten mit
abstrakten Operatoren, was u.a. Objekte wie Funktionale oder Systeme,
die auf Funktionen arbeiten, ermöglicht. Besonders nützlich vielleicht
auch in der Vektoranalysis oder linearen Algebra.
- Bessere interne Darstellung der Ausdrücke, die endlich auch
aufwändige algebraische Operationen erlaubt/vereinfacht, wie
beispielsweise die Integration und das Lösen von Gleichungen.
- Komplett neuer, viel robusterer Parser, der viele neue
Möglichkeiten mit sich bringt (u.a. auch einen Interpreter für ganze
Batches mit üblichen Erweiterungen wie Schleifen und Bedingungen).
- Hierarchisches Kontextsystem mit Master-, Session- und (rekursive)
LocalContext, das zusammen mit dem neuen Parser auch einen Scope bei
grösseren Batches/Scripts erlaubt
- Funktionen können auch direkt in einer Session definiert (bei
Bedarf auch überschrieben) werden, auch abstrakte Funktionen sind
möglich (ohne Implementation).
- Keine Unterscheidung mehr zwischen reellen und komplexen Skalaren.
- Vereinfachung durch Variablen im Alias Mode. Falls beispielsweise a
als sin(c)/c definiert ist, dann wird zweiteres in der Ausgabe
automatisch mit a ersetzt (per default deaktiviert).
Einige neue Möglichkeiten des Parsers (teilweise geplant, teilweise bereits umgesetzt):
- A := {C|1,I+1,-I,I} //Definiert eine neue Skalare Menge aufbauend auf der internen Menge C (komplexe Ebene)
- B := {R:x|2<x<=10,odd(x)} //Definiert die Skalare Menge (aus R) mit den Werten 3,5,7,9
- D := {C|A,B,{R|-1,-2},-3,-4} //Definiert eine neue Zusammengesetzte Menge
- sinc := x -> sin(x)/x //Definiert eine neue skalare Funktion mit einem skalaren Prameter.
- T := f(x) -> int(f(x),x=0..1) //Definiert ein Funktional auf eine skalare Funktion
- diff(f(g(x)),x) //Wendet die allgemeine Kettenregel auf zwei abstrakte Funktionen an.
- (2*sin*cos)(x) //Wendet x auf die anonyme Funktion 2*sin(x)*cos(x) an
- diff(sin)(Pi) //Wendet Pi auf die anonyme Ableitung von sin ab - entsprich cos(Pi), also -1;
- a(2) := a(0) //Setz den Wert der dritten Komponente eines Vektors auf den Wert der ersten Komponente