September 2003 - Posts

Verschmelzen von komplexen und reellen Ausdrücken in Math.NET
20 September 03 09:51 | Christoph Rüegg | with no comments

Die aktuelle Trennung zwischen "Scalar" und "Complex" (wobei Zweiteres auf Ersterem aufbaut) wird je länger je mehr zum Problem, ohne - dank der vergangenen und aktuellen Architekturverbesserungen - noch irgendwelche Vorteile zu bringen. Ich werde daher die beiden Typen in der kommenden oder übernächsten Release zu zu einem Skalartyp verschmelzen.

Dieses Verschmelzen wird in einer brauchbaren Form durch die neuen Mengen (insbesondere Bildmengen von Ausdrücken im Sinne des Bildbereiches der Ausdrucksfunktion) ermöglicht, die in Release 0.18 kommen werden. Diese Mengen ermöglichen beispielsweise zu ermitteln, ob ein Ausdruck sicher reell ist (für alle Variablenwerte - Variablen können neu im Bereich durch Mengen eineschränkt werden), ob er in C* = C\{0} oder gar C-* = C\{z in C | Im z = 0 && Re z <= 0} liegt etc., womit im reellen Fall beispielsweise trotzdem effizientere Operationen ermöglicht werden. Ein Grenzfall, der durch die Mengen auch mehr oder weniger elegant gelöst werden kann, ist die Repräsentation des Unendlichen infinity(). Wird dieser auf das relle beschränkt (default: positiv unendlich), so unterscheidet sich infinity() und -infinity(), im Komplexen jedoch sind ja nach der Riemannschen Zahlenkugel beide im Punkt [0,0,1] vereinigt und äquivalent.

Da IComplexExpression in IScalarExpression integriert werden wird fällt auch die Unterscheidung zwischen komplexer und reeller linearer Algebra weg, die insbesondere bei gemisten Vektoren bisher etwas unschön gelöst war ...

Filed under: ,
Gleichungen l&amp;#246;sen mit Math.NET
19 September 03 09:25 | Christoph Rüegg | with no comments

Ich wurde in letzter Zeit vermehrt nach der Möglichkeit des Gleichungslösens mittels Math.NET gefragt.

Die Bibliothek implementiert bisher (Release 0.18) keine Algorithmen zum Lösen von Gleichungen, nicht mal für den einfachsten Fall, der linearen Gleichung. Einzige Ausnahme ist der MatrixSim Operator, mit dem (irreguläre) lineare Gleichungssystem via Gaussverfahren und Zurückeinsetzen (im LR Verfahren) automatisiert gelöst werden können. So können beispielsweise Systeme wie:

2*a + 3*b -4*c = -13
a + -x*b + 3*c = t^2
t*a + t^2*b = -t

einfach nach [a,b,c] gelöst werden:

MatrixSim([[2,a,t],[3,-x,t^2],[-4,3,0]],[-13,t^2,-t])

liefert den passenden Vektor zurück. Ist das System irregulär (zb. singulär oder unterdefiniert) so werden neue Parameter eingeführt, je einer pro Freiheitsgrad. Achtung: Ist das System überdefiniert, so ignoriert es zur Zeit diese Überdefiniertheit bzw. die entsprechenden rechten Seiten!

MatrixSim hilft allerdings nichts, auch nur die einfachste Gleichung wie

2*x-3 = t

nach x aufzulösen. Die Polynome, die in der Release 0.18 eingeführt werden, helfen jedoch zumindest bei Polynomialen Gleichungen der Form

a*x^3 + b*x^2 + c*x + d = 0

weiter. Ist das Grad klein genug, so kann mit allgemeinen Lösungsformeln gearbeitet werden, andernfalls mit Faktorisierungsstrategien, oder evtl. zur Approximation auf Verfahren wie das von Newton zurückgegriffen werden. Ich werde versuchen, in diesem Bereich etwas zu implementieren ... damit erhält Math.NET zumindest einen Solver für einfache Problemstellungen ...

Filed under: ,
Verbesserungen an der Math.NET API
15 September 03 01:01 | Christoph Rüegg | with no comments
Die Math.NET API wurde bisher v.a. im Hinblick auf Flexibilität, Abtraktheit und dynamischer Term Generierung (insbesondere via Parser) designt. Daneben sollte sie sich aber schon seit Beginn als klassische API bewähren; dieser Aspekt wurde zugunsten der Abstraktheit bisher allerdings stark vernachlässigt.

Ich habe mir daher einige Anpassungen vorgenommen. Wichtigste Änderung dürfte sein, dass die Operator Basisklassen neu Methoden für Standardoperation wie die Addition un die Multiplikation zur Verfügung stellen werden. Da alle entsprechenden Klassen von ihren Operator Basisklassen erben sind diese Methoden sofort überall verfügbar. Ausserdem harmonisieren diese Methoden bestens mit den neuen algebraischen Schnittstellen wie IAlgebraicRing. Die Vereinfachung ist jedoch erheblich:

Seien z.B. z1 und z2 zwei komplexe Zahlen. Wir wollen in z3 das negative Produkt dieser Zahlen.

bisher:
IComplexExpression z3 = new ComplexNegative(context,new ComplexMultiplication(context,z1,z2));

neu:
IComplexExpression z3 = z1.Multiply(z2).Negate();

Im Hintergrund werden die neuen Methoden natürlich dasselbe machen wie bisher. Auch werden nur eine kleine Auswahl an Operationen als Methoden zur Verfügung gestellt werden, speziellere Operationen wie Sinus oder die Exponentialfunktion werden weiterhin wie bisher angewandt werden. Das ganze wird voraussichtlich in die nächste Release (0.18) verfügbar sein.
Filed under: ,
Math.NET: Achsenbeschriftung f&amp;#252;r Funktionsgraphen
13 September 03 09:51 | Christoph Rüegg | with no comments

Ab der nächsten Release werden die Funktionsgraphen auch mit passenden Achsen gezeichnet. Die Beschriftung der Achsen mit passenden Zahlen hat sich dabei als nicht ganz trivial herausgestellt, da die Achsen beliebig skaliert sein können und eine möglichst natürliche Beschriftung verlangt ist, d.h. möglichst runde Zahlen in einer nützlichen Dichte (zb. ungefähr alle 2 cm eine Beschriftung).

Falsch: [1.21,2.32,3.43,..]
Richtig: [1,2,3,4,...]

Falsch: [0.413,0.413322,0.414823,0.416,..]
Richtig: [0.41,0.412,0.414,...]

Falsch: [0.12,0.52,0.92,...]
Richtig: [0,0.5,1,1.5,...]

etc.

Der Algorithmus, den ich mir dazu ausgedacht habe, ist ein Hack und kaum optimal:

Graphing.cs CVS Online View

Wie das ganze gerendert dann so aussieht sieht man auf dem PocketPC Screenshot ganz unten.

Vorschläge für bessere Ansätze?

Filed under: ,