# Mathematische Funktion umstellen und vereinfachen



## Beware (11. Nov 2014)

Hallo,

ich suche eine Java-Klasse/Bibliothek mit der es möglich ist eine Funktion umstellen zu lassen.

Beispiel:
Eingabe: 1 - 4 * (x+1) + 2 (x+1) (x-0)
Ausgabe: 2x^2 - 2x - 3

Es sollen Gleichungen bis ca. 50. Grades vereinfacht werden können.

Falls jemanden eine solche Library bekannt ist, wäre ich dankbar, wenn er mir diese nennen könnte.
Meine eigene Suche hat leider nichts brauchbares zutage gefördert.

Grüße


----------



## javampir (11. Nov 2014)

hi,
ich kenne leider keine lib, aber sofern es sich "nur" um polynome handelt, sollte sich das ganze (kommt ein wenig auf die Eingabe an) verhältnismäßig einfach implementieren lassen. Die Ausgabe ist dabei einfach objekt einer Klasse Polynom, welches in einem array die koeffizienten gespeichert hat. angenommen, du hast die eingabe als string, dann musst du dir überlegen, wie tolerant du sein willst, wenn beispielsweise eine klammer nicht geschlossen ist oder so, aber ansonsten kannst du die ausdrücke in den klammern dann wieder als polynome auffassen und in der klasse Polynom dann eine Methode multiply anbieten, die dann die klammern und die vorfaktoren (Polynome 0. Grades) zusammenmultiplizieren.
javampir


----------



## Beware (11. Nov 2014)

Danke für deine Antwort. Der Ansatz ist gut, aber leider ist der Eingabestring ein Interpolationspolynom in der Form 

P(x) = a0 + a1 * (x-x0) + a2 * (x-x0) * (x-x1) + a3 * (x-x0) * (x-x1) * (x-x2) + ...

Ich möchte mit meinen Programm zu 30-50 Messpunkten eine Funktion errechnen und dann plotten lassen, aber derzeit scheitert es eben an dieser Umformung, da die Plotter-lib ein Polynom der Form 

ax^n + bx^(n-1) + cx^(n-2)... 

übergeben haben will.


----------



## Gucky (11. Nov 2014)

Hast du die Messpunkte vorliegen? Dann kannst du relativ einfach das Polynom dazu berechnen.
Du stellst einfach die Bedingungen auf (f(5)=7 usw.) fügst das in ein zweidimensionales Array vom Typ double ein, wendest den Gauss'schen Algorithmus oder Apache math darauf an und schon hast du die Koeffizienten des Polynoms.

Ich habe schon mal für ein Projekt genau das implementiert und könnte dir da helfen.


----------



## stg (12. Nov 2014)

Mal ganz unabhängig von der Tatsache, dass es, wie bereits gesagt wurde, kein großes Ding ist, eine solche Klasse "Polynom" zu erstellen, die das gewünschte leisten kann, solltest du womöglich deinen Ansatz noch einmal komplett überdenken. 
Aus 50 Messwerten ein Polynom zu ermitteln, um zu interpolieren, wird in den allerseltensten Fällen das gewünschte leisten. Messwerte sind grundsätzlich immer von Ungenauigkeiten behaftet und schon kleine Verschiebungen einzelner Messwerte können zu einem vollkommen anderen Interpolationspolynom führen. 
Viel besser geeignet und noch relativ leicht zu verstehen sind z.B. eine einfache kubische Spline-Interpolation. Hier setzt du jeweils Stückweise zwischen zwei Messpunkten dein gesamte Interpolation aus einzelnen Polynom driten Grades zusammen, und zwar derart, dass diese an den Übergängen, also an den Messstellen selbst, immer noch zweimal stetig differenzierbar sind.
Es gibt natürlich noch etliche andere Ansätze, aber der der kubische Spline-Interpolation verlangt noch nicht viel mathematisches Basiswissen. Eine Polynominterpolation ist jedenfalls fast immer gänzlich ungeeignet. Vorallem bei so vielen Messwerten.


----------



## stg (12. Nov 2014)

Nur mal ein kleines Beispiel, um zu verdeutlich, was ich da quassel... das klassische Beispiel ist die Runge-Funktion, welche hier durch ein Polynom 10ten Grades interpoliert werden soll. 

Anhang anzeigen 7087


----------

