Irgendwie brauchte ich eine Bibliothek in c #, die symbolische Berechnungen durchführen kann (von Zeit zu Zeit ergänze ich die Fähigkeiten eines mathematischen Programms). Jeder Quellcode im Netzwerk kann in verschiedenen Sprachen gefunden werden, aber es war nicht möglich, etwas Einfacheres und Verständlicheres zu finden. Er machte auf
Jasymca (Java Symbolic Calculator) aufmerksam .
Herausforderung
Um ein Analogon des Mathcad-Odesolve-Blocks in SMath Studio zu implementieren, mussten Gleichungen für Ableitungen gelöst werden. Es gibt keine besonderen Einschränkungen für das lösbare ODE-System. Was der Benutzer in einer relativ willkürlichen Form festlegt, muss in eine Form konvertiert werden, die für die numerische Lösung der ODE geeignet ist. Es sollte so aussehen:

Es stellte sich im allgemeinen Fall als schwierig heraus, die Möglichkeiten der c # -Sprache zu umgehen. Die Hilfe der Charakter-Engine würde nicht schaden.
Quellkonvertierung
Ich habe mir den Quellcode für das Applet angesehen. Es scheint nicht sehr beängstigend, aber Sie benötigen einen Java-Konverter in c #. Zu der Zeit, als ich gerade damit anfing, fand ich eine mehr oder weniger funktionierende Online-Ressource, an die ich mich jetzt nicht erinnern konnte. Es sieht so aus, als wäre es eine Ressource von Tangible Software Solutions, as Kommentare im Quellcode ähneln denen, die der aktuelle Konverter als Programm erstellt.
Alles ist gut, aber eines ist schlecht. Die Ressource konvertierte kostenlos nur die begrenzte Größe der Quelle. Wahre Begrenzung der Anzahl der Zeilen. Es ist sehr seltsam, dachte ich und habe den gesamten Inhalt einer Datei in einer Zeile ausgeblendet. Dann habe ich den einzeiligen Quellcode kostenlos in das c # -Äquivalent konvertiert und ihn in Visual Studio mithilfe der automatischen Formatierung wieder normalisiert.
Dateifinalisierung
Es ist unnötig zu erwähnen, dass der automatische Konverter größtenteils Formulare konvertiert, aber mit dem Inhalt, an dem Sie noch arbeiten müssen. Zu diesem Zeitpunkt wurde mir klar, dass ich offensichtlich nicht genug Sprachkenntnisse in beiden Sprachen hatte, um alle Kompilierungsprobleme zu lösen. Die Zeit verging, verehrter John Skeet. Genosse Skeet vermittelte Entschlossenheit.
Während des Kampfes um die Zusammenstellung erinnerte sich der Konverter mit einem freundlichen Wort. Er hat fast die ganze mühsame Arbeit gemacht. An einigen Stellen beherrschte er nicht nur den mathematischen Teil. Es handelte sich um eine große Klasse von JMath. Die Konvertierung der Doppel- in Hex-Darstellung und umgekehrt beruhte in einigen Fällen auf einer Einschränkung für die BitConverter.Int64BitsToDouble () -Methode, die mit einigen vorzeichenlosen langen Konstanten nicht funktioniert, z. B. -0 (
0x8000000000000000 ). Auch hier kam Genosse Skeet zur Rettung, nicht ohne deren Hilfe es uns gelungen ist, diesen Wert als 1.0 / double.NegativeInfinity darzustellen. Im Allgemeinen verfolgt mich diese Arithmetik des "Infinitesimalen" immer noch, weil Ich bin mir nicht sicher, ob der Autor Jasymca alles richtig interpretiert hat.
Nachdem wir einige semantische Fehler korrigiert, die Arbeit durch Typen und ihre Instanzen ersetzt und eine Konsolenschnittstelle hinzugefügt hatten, konnten wir dieses Projekt starten. Ich wollte schon lange die innere Küche solcher symbolischen Programme betrachten. Symbolisches C ++ ist eine Sache und Java oder C # ist eine ganz andere. Die Eintrittsschwelle ist viel niedriger.
Zum Zeitpunkt des Schreibens sieht der Rechner folgendermaßen aus:

Die ausführbare Datei ist im
Repository verfügbar. Benötigt .Net 2.0. Es besteht eine Abhängigkeit von LinqBridge, damit Linq in .Net 2.0 funktioniert (die Bibliothek ist dort angehängt).
Fast alles funktioniert aus der
Dokumentation des Autors Jasymca. Die Ausnahme ist das Arbeiten mit Grafiken, d. H. Plotfunktionen. Ich denke, es wird einfacher sein, diesen Teil erneut zu schreiben als zu portieren. Von Bibliotheken von Drittanbietern abhängige Funktionen (LAPACK usw.) sind nicht enthalten. Es gibt auch Störungen, die im Laufe der Zeit behoben werden.
Fazit
Das Projekt wurde für Liebhaber der symbolischen Mathematik erstellt. Falls gewünscht, kann es in die Bibliothek gebracht und in Ihren eigenen Projekten verwendet werden, in denen einfache numerische oder symbolische Mathematik erforderlich ist: Arbeiten mit komplexen Zahlen, Integration, Differenzierung, Lösen von Gleichungen usw. Der Autor Jasymca
positionierte das Programm als Schulungswerkzeug für diejenigen, die ihr eigenes Programm erstellen möchten Durchführen symbolischer Berechnungen:
Jasymca wurde für den Mathematikunterricht entwickelt, insbesondere um einen schnellen und einfachen Zugang zur Computermathematik zu ermöglichen. Eines der Haupthindernisse sind Taschenrechner, die viele Schüler daran hindern, Computer für Mathematik zu verwenden. Taschenrechner sind billig und tragbar, während CAS-Programme oft teuer sind und immer mindestens einen Laptop benötigen, um ausgeführt zu werden. Jasymca ist freie Software und läuft auf fast jedem System, das mit einem Mikroprozessor ausgestattet ist: von Mobiltelefonen und PDFs über Windows- / Linux- / Macos-Computer bis hin zu Spielekonsolen oder Internet-Routern.
Ich hoffe, dass die c # -Version des Quellcodes auch für Sie nützlich sein wird.
Referenzen
1.
Jasymca (Java Symbolic Calculator) .
2.
Quellen von Jasymca (Reißverschluss) .
3.
Jasymca 2.0 - Symbolischer Rechner für Java (Handbuch, pdf) .
4.
Eine Übersicht über solche Java-Bibliotheken .
5.
Das Repository des Projekts .