Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Termumformung (https://www.delphipraxis.net/165924-termumformung.html)

nahkillo94 22. Jan 2012 00:14

Termumformung
 
Hallo,

ich habe eine Frage für mein Informatik-Projekt.


Ich schreibe einen Funktionsparser mit Graph zeichnen, basierend auf der umgekehrten polnischen Notation. Zurzeit erarbeite ich mir die Theorie dazu. An sich kein Problem, doch jetzt bin ich am überlegen, wie kann man denn einen Term (in der UPN-Form) nach einer Variable umformen? Geht das Überhaupt? Beispielsweise zur Berechnung der Nullstelle einer Funktion? :?:

infix:
y = 2 * x + 2
0 = 2 * x + 2
x = (0 - 2) / 2
x = -1

postfix:
y = 2 x * 2 +
0 = 2 x * 2 +
x = :?:
x = -1

himitsu 22. Jan 2012 00:48

AW: Termumformung
 
0 2 - 2 /

fällt bestimmt auf, wenn du die anderen Klammern so setzen würdest, wie es die Rechenreihenfolge vorgibt
2 * x + 2 = (2 * x) + 2

Namenloser 22. Jan 2012 00:49

AW: Termumformung
 
Prinzipiell müsste das genau so gehen wie bei der Infix-Notation.
Delphi-Quellcode:
2 x * 2 +
ist ja letztlich nur eine andere Schreibweise für
Delphi-Quellcode:
((2*x) + 2)
, ergo müsstest du das genau so auflösen können, indem du dich von der äußersten Schicht zur inneren Schicht durcharbeitest und jeweils die Gegenoperationen ausführst.

1. Operand = Rot, 2. Operand = Grün, Operator = Blau

0 = 2 x * 2 +
Der Gegenoperator zu + ist −:
→ 0 2 − = 2 x *

0 2 − = 2 x *
Der Gegenoperator zu * ist /:
→ 0 2 − 2 / = x

0 2 − 2 / = -2 2 / = -1

-1 = x
Zumindest bei dem Beispiel klappt es. Das automatische Auflösen wird trotzdem nicht gerade eine einfache Aufgabe sein, da es oft mehrere Handlungs-Möglichkeiten gibt. Z.B. hätte man im 2. Schritt genau so gut durch X teilen können, was einen in diesem Fall natürlich nicht weiter gebracht hätte. Das ist natürlich nur dann der Fall, wenn für den jeweiligen Operator das Kommutativgesetz gilt, also hier bei + und *. Bei − und / z.B. macht die Reihenfolge ja durchaus einen Unterschied, da kann man sich nicht einfach aussuchen, welchen Operanden man rüberschiebt.

Ich weiß ja nicht genau, wofür du das brauchst, aber eventuell wäre es sinnvoller, die Nullstellen nur über ein numerisches Verfahren wie das Newton-Verfahren anzunähern. Das ganze algebraisch korrekt zu lösen wird ziemlich kompliziert... nicht umsonst kosten Computer-Algebra-Systeme wie Mathematica hunderte von Euros.

Furtbichler 22. Jan 2012 08:47

AW: Termumformung
 
Also ich hab früher einfach eine Iteration geschrieben, um die Nullstelle zu ermitteln. Newton und Regula Falsi fallen mir spontan ein.

nahkillo94 22. Jan 2012 10:09

AW: Termumformung
 
Vielen Dank für eure Hilfe.

Zitat:

Zitat von NamenLozer (Beitrag 1147062)
Prinzipiell müsste das genau so gehen wie bei der Infix-Notation.
Delphi-Quellcode:
2 x * 2 +
ist ja letztlich nur eine andere Schreibweise für
Delphi-Quellcode:
((2*x) + 2)
, ergo müsstest du das genau so auflösen können, indem du dich von der äußersten Schicht zur inneren Schicht durcharbeitest und jeweils die Gegenoperationen ausführst.[indent]

Dann werde ich es mal versuchen umzusetzen. Ansonsten das Newton-Verfahren. Danke für diesen Hinweis. :thumb:

Furtbichler 22. Jan 2012 11:21

AW: Termumformung
 
Mir fallen da gar lustige Probleme ein, wenn die Formel etwas größer ist.

In jedem Fall wäre eine analytische Lösung sehr elegant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz