Ableitungsrechner selbst programmieren

Neue Frage »

Auf diesen Beitrag antworten »
netfruit Ableitungsrechner selbst programmieren

Meine Frage:
Hallo zusammen! Ich möchte gerne einen eigenen Ableitungsrechner für das iPhone programmieren. Objective-C hab ich mittlerweile ziemlich gut im Griff, bald geht meine zweite App online.

Doch beim Ableitungsrechner fehlt mir schlicht eine zündende Anfangsidee, wie ich das Ganze angehen sollte. Im Prinzip sollte der Ableitungsrechner nicht anderes machen, als es der Rechner hier unter Mathetools tut: Funktionen eingeben und die Ableitung wieder ausgeben.

Mein eigentliches Hauptproblem besteht darin, meine Ideen in ein Programm zu übersetzen. Die Funktionen soll von einem Benutzer eingegeben werden können. Die Funktion wird nachher als String (bzw. NSString in Objective-C) behandelt. Wie muss ich den String zerhacken und untersuchen, damit ich die Ableitung berechnen kann?

Meine Ideen:
Ich hab mir natürlich bereits einige Gedanken gemacht:

Erst einmal die Additionsregel berücksichtigen, d.h wir splitten die Funktion (als String) in die einzelnen Teilfunktionen, denn laut der Additionsregel kann man diese separat behandeln.

Konstantenregel: die Teilfunktionen bzw. in diesem Fall Konstante kann weggelassen werden (=0).

Auf die übrigen Teilfunktionen werden Kettenregel, Produktregel und Quotientregel so lange angewandt, bis keine Vereinfachung des Terms mehr möglich ist. Natürlich wird jede dieser Teilfunktionen auch auf die elemenatren Funktionen (trigonometrische, logarithmische, exponentielle F. etc.) untersucht und entsprechend abgeleitet.
 
Auf diesen Beitrag antworten »
ed209

Du hast dir da keine ganz triviale Herausforderung gestellt smile
Texte als Formeln zu interpretieren ist typische Aufgabe für einen Parser.
Als erstes sollte dir klar sein, was für Rechenarten du unterstützen willst.
Dann mußt du wissen wie du das ganze intern darstellen willst. (Also deine c structs, klassen oder wasauchimmer).

Und dann fangen die Probleme an.... smile

Wenn du es dir einfach machen willst, benutzt du polnische Notation smile

Ich behaupte, wenn Du den Term erstmal eingelesen hast und intern vernünftig darstellst (als Baum oder etwas ähnliches), dann ist der Rest nen Klacks smile
Auf diesen Beitrag antworten »
CookieMonsta

Ich geb ed recht, das ordentliche parsen wird der schwierige Teil. Von Java Seite kenne ich da ein Erweiterung die sich ANTLR nennt. Generiert aus Grammatiken die an EBNF angelehnt sind, Java code, also einen Parser. Vielleicht findest du unter dem Stichwort etwas vergleichbares für Objective C?

Auf jeden Fall kann es nicht verkehrt sein erst einmal eine Grammatik zu schreiben, denn das macht das Schreiben eines eigenen Parsers auch wesentlich einfacher.

Soll dein Ableitsungsrechner auch Funktionen mit mehreren Variablen können? Dann hören zumindest meine Ideen für eine saubere Grammatik bzw Parser auf (eigentlich auch meine Mathekenntnisse).
Auf diesen Beitrag antworten »
ed209

@CookieMonsta

Ich würde das ganze in der Grammatik etwa so angehen:

<funktion> ::= <bezeichner> '(' <parameterliste> ')'
<parameterliste> ::= <term> | <term> ',' <parameterliste>

Wie das dann ableitet weiß ich dann aber auch nicht smile

Gruß,
ED

PS: Alle anderen nicht verwirren lassen.
 
Auf diesen Beitrag antworten »
ed209

@alle:

Die von CookieMonsta vorgeschlagene Methode ist zwar die die ich für grössere Projekte empfehlen würde.
Aber bei einem simplen Term-format ist es vermutlich noch einfacher den Parser selber zu schreiben als einen Parsergenerator zu verwenden.
Trotzdem kann es hilfreich sein, die Grammtik formal aufzuschreiben.

Gruß,
ED
Auf diesen Beitrag antworten »
CookieMonsta

Zitat:
Original von ed209
<funktion> ::= <bezeichner> '(' <parameterliste> ')'
<parameterliste> ::= <term> | <term> ',' <parameterliste>

Wie das dann ableitet weiß ich dann aber auch nicht smile


Du meine Güte, die Ableitung kann ich mir da nicht vorstellen. Ich schätze mal zunächst reicht es doch auch, mit einem einzelnen Parameter das ganze aufzubauen?! Oder sollte netfruit doch etwas hohe Ansprüche an das Programm haben...?

Schwierig wird auch vor allem die Fehlerbehandlung bei inkonsistenten Variablenbenennungen, z.B.: f(x) = y+7

Um da Einstiegsmöglichkeit zu haben wäre es sicher sinnvoll linke und rechte Seite der Gleichung grammatikalisch zu trennen:

<funktion> ::= <bezeichner> '(' <parameterliste> ')' '=' <term>
<parameterliste> ::= <term> | <term> ',' <parameterliste>
<term> ::= <special> | <term> '+' <term> | <var> | '(' {<term>} ')' | <mul> | <number>
<mul> ::= <term> '*' <term>

var also variablen, number beliebe zahl, und so hat man auch die produktregel vor der additionsregel, was das ableiten einfacher macht. Ist natürlich nicht ganz korrekt und sehr unvollständig gibt aber hoffentlich einen kleinen hinweis. (auch division muss vor der addition kommen, also weiter unten in der grammatik --> was weiter unten, somit "näher" an terminalen ist, wird zuerst ausgeführt).

edit: <special> ::= 'sin(' <term> ')' cos usw
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »