Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ableitung berechnen mit Taylor-Reihe?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.11.2014, 21:06 Uhr
FelRPL



Hey,

habe in der Uni im Moment ein Projekt am laufen.
Es soll mathematische Funktionen ausrechnen können. Das ganze funktioniert bislang mit Java und Antlr4.

Also Antlr4 generiert mir Bäume die in etwa aussehen:

Der generierte TreeWalker iteriert dann darüber und ruft die entsprechenden Funktionen im Listener auf. So wird das ganze dann berechnet.
Damit lassen sich dann Ausdrücke wie: f(a,b)=2*a-5*b^2; f(3,4); oder einfach nur Rechnungen wie 5-(2*3) ausrechnen.

Nun soll hinzukommen, dass eine C++ Routine die Ableitung an einer bestimmten Stelle ausrechnet. Also f(x)=x^2; f'(2); oder Ähnliches.
Das ganze soll über die JNI Schnittstelle implementiert werden.

Erste Aufgabe soll es sein, erstmal eine solche Ableitung an einer Stelle x0 zu berechnen in einer C++ Funktion. Da wir uns C++ jetzt selbst aneignen müssen bin ich ziemlich ratlos wie man in C++ "rechnet".

In Java kann ich einen String ja nur ausrechnen indem ich über Bäume iteriere und dann Funktionen im Listener aufrufe, die dann Ergebnise auf einen Stack pushen und verrechnen.
In C++ hab ich jetzt natürlich weder einen TreeWalker, noch Antlr4, noch einen Listener etc.
Gibt es eine Datenstruktur oder irgendwelche andere Verfahren um eine Funktion zu berechnen oder wie geht man das am besten an?

Denke wir sollen keine fertig implementieren Schnittstellen nehmen sondern sowas "händisch" machen.

Hoffe jemand hat da einen Ansatz

Grüße

Dieser Post wurde am 28.11.2014 um 21:07 Uhr von FelRPL editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2014, 22:47 Uhr
Hans
Library Walker
(Operator)


Hi,

auf der Wikipediaseite von ANTLR liest man u.a.:

Zitat von Wikipedia:

ANTLR unterstützt die Erzeugung von Parsern, Lexern und TreeParsern für LL(k)-Grammatiken mit beliebigen k.
...
Als Zielsprachen werden u. a. ActionScript, Ada95, C, C++, C#, Java, JavaScript, Objective-C und Python unterstützt.

Unten auf der Seite findet sich dann ein Link zu einer Seite die erklärt, wie man ANTLR dazu bewegt, C++ code zu erzeugen.
Die JNI-Schnittstelle ist der Weg, die in C++ erstellten Funktionen in Java verfügbar zu machen, wie ich einem weiteren Artikel der Wikipedia entnommen habe. Da ist unten ebenfalls ein einführender Artikel zur Handhabung der Schnittstelle vorhanden. Also kannst Du weiter auf Deinen Listner aus Java aufbauen.

Beim TreeWalker und Listner handelt es sich im übrigen um Funktionen (oder Programme), die man auch in C++ oder sonst einer Programmiersprache realisieren kann.
Wenn mich nicht alles täuscht, ist der TreeWalker nichts anderes als eine Funktion, die die Datenstruktur "Baum" traversiert. Da es um die Auswertung von arithmetischen Ausdrücken geht, dürfte es sich um Postorder-traversierung handeln. Das kann man beispielsweise bei Sedgewick, Algorithmen in C++ nachlesen. Zum Vergleich kann man den Titel Algorithmen in Java vom selben Autor heran ziehen.


Zitat:

Erste Aufgabe soll es sein, erstmal eine solche Ableitung an einer Stelle x0 zu berechnen in einer C++ Funktion. Da wir uns C++ jetzt selbst aneignen müssen bin ich ziemlich ratlos wie man in C++ "rechnet".


Das Problem, wie man eine Ableitung bestimmt, findet sich in den Lehrbüchern zur numerischen Mathematik, Stichwort Newtonverfahren. Dann suchst Du in der Bibliothek nach Büchern, die numerische Mathematik auch gleich anhand von Quellcode demonstrieren. Etwa Numerical Recipes Example Book (C++): The Art of Scientific Computing by Vetterling, William T., Press, William H., Teukolsky, Saul oder Numerik-Algorithmen; Verfahren, Beispiele, Anwendungen von Gisela Engeln-Müllges u.a. - Von dieser Dame gibt es auch Versionen des Buches mit Beispielcode in unterschiedlichen Programmiersprachen. Die sind aber schon etwas älter.

Als letztes wäre noch ein gutes Lehrbuch zu C++ nötig. Da gibt es auch den einen oder anderen Titel, der Java und C++ gegenüber stellt, etwa dieses hier: Objektorientierte Programmiersprachen. Einführung und Vergleich von Java, C++, C# und Ruby von Klaus Zeppenfeld. Ansonsten nachsehen, was die Biliothek sonst noch im Angebot hat und gucken, womit man am besten klar kommt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 28.11.2014 um 22:50 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.11.2014, 14:30 Uhr
FelRPL



Hey, danke schonmal für die ausführliche Antwort.

Heißt der einzige Weg ist im Endeffekt wieder mit Antlr etc in C++ zu arbeiten?
Der Algorithmus zur Berechnung ist für mich erstmal das kleinere Problem.
Viel interessanter wäre für mich wie man überhaupt erstmal "rechnet".

Hab von OpenSource Projekten gelesen, die auch Differenzieren etc und dafür den ()-Operator überladen und dann irgendwie intelligent rechnen.

Oder kommt ich um Antlr etc nicht herum?

Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.11.2014, 15:35 Uhr
Hans
Library Walker
(Operator)


Hi,

so wie ich Deinen letzten Beitrag verstehe, willst Du ANTLR wohl nicht verwenden. Wenn dem so ist, dann kommst Du um ein gutes C++ Lehrbuch (etwa Breymann) nicht herum. Was das Rechnen ansich angeht, also die Grundrechenarten, so gibt es da keine besonderen Unterschiede zwischen Java und C++. Einen Ausdruck wie etwa 2*x*x + 3*x - 1 berechnet C++ genauso wie Java. Für andere Funktionen, etwa Winkelfunktionen, Potenzen und Wurzeln gibt es in C++ eine Mathe-Bibliothek, die zur Sprache dazu gehört. Die genauen Unterschiede solltest Du in entsprechenden Büchern nachsehen, weil ich die auch nicht weis, da ich bisher kaum mit Java gearbeitet habe.

Differenzieren ist genauso wie auch integrieren eine Frage des Algorithmus, da es ja keine Grundrechenart mehr ist.
Operatoren zu überladen ist eines der Konzepte, in denen sich C++ von C unterscheidet; - das braucht man, um mit verschiedenen Datentypen arbeiten zu können, ohne sich immer darum kümmern zu müssen, welcher Datentyp gerade benutzt wird. Das nimmt einem dann der Compiler ab. Aber um das richtig zu nutzen sollte man auch ein Buch zu Rate ziehen, denn das lässt sich nicht in drei Sätzen erklären.

Hans


Nachtrag: Wenn Du mal die Suchfunktion des Forums bemühst, findest Du auch das hier: www.fun-soft.de/showtopic.php?threadid=1060
ein C++ Programm, welches Funktionswerte der logarithmischen Funktion y= f(x) = lnx berechnet, bzw. zumindest die Funktionen für die Berechnung. Es fehlt ein Rahmenprogramm.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 30.11.2014 um 20:01 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: