![]() |
Re: Kompilierender Matheparser
Hier mal die Areafunktionen (Hauptwerte):
Code:
Wobei alle vorkommenden Funktionen komplex sind, d.h. zB beim Artanh, dass Ln und Sqrt ein komplexes Ergebnis liefern müssen. Wegen den inversen Kreisfunktionen such ich noch. Hier noch die Hyperbelfunktionen, falls du sie noch nicht hast:
Arsinh z = Ln( z + sqrt(z^2 + 1)
Arcosh z = Ln( z + sqrt(z^2 - 1) Artanh z = Ln[sqrt((1 +z)/(1-z))]
Code:
wobei z (komplex) = x+ jy. Hier sind die normalen Funktionen gemeint - also die normalen Hyperbelfunktionen (z.B. cos(2y) ist einfach der Cosinus vom Imaginärteil * 2)
sinh z = sinh(x)*cos(y) + j*cosh(x)*sin(y)
cosh z = cosh(x)*cos(y) + j*sinh(x)*sin(y) tanh z = [sinh(2x) + j*sinh(2y)]/[cosh(2x) + cos(2y)] Dust Signs //EDIT: Zitat:
//EDIT 2: Hab die Arcusfunktionen doch noch gefunden - der Arcustangens fehlt noch, aber den treib ich noch irgendwo auf ;)
Code:
wobei hier Ln und Sqrt auch wieder komplex arbeiten müssen
Arcsin z = -j * Ln(j*z + Sqrt(1 - z^2))
Arccos z = -j * Ln(z + Sqrt(z^2 - 1)) |
Re: Kompilierender Matheparser
Zitat:
Zitat:
OT: Woher kannst du das mit 18 schon alles? Ich hatte damals keinen Lehrer an unserer Schule der mir grad mal das Wesen der komplexen Zahlen erklären konnte. Ich musse leider komplett autodidaktisch ran :?. \\EDIT: Deine Signatur is mal geil ^^ \\EDIT2: Die komplexen hyperbolischen Funktionen sind drin - jedoch nicht die inversen dazu. |
Re: Kompilierender Matheparser
So, neue Echsen und Soßen gegen jim's AV-Problem sind oben, aber gegen DS' tan hab ich leider nich nix tun können :?
Ich geh jetzt rasen mähen *bäh* Dann implementier ich nach möglichkeit die Arcusfunktion usw und mach die CaseSensitivity weg |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Zitat:
Zitat:
Dust Signs //EDIT: @Dizzy: Zu OT (18 und komplexe Zahlen): können uns gerne über Messenger (dustsigns@hotmail.com) weiter darüber unterhalten, damit wir das Topic hier nicht zuspammen. Und zwecks Eigennutzen :mrgreen: <werbung> ![]() |
Re: Kompilierender Matheparser
Zitat:
Sieht so aus, als ob er bei komplexeren Formeln Probleme hätte :( Hoffentlich bekommst du das in den Griff ;) Aber auf jeden Fall bisher gute Arbeit, vor allem weil dies der Anfang für einen Compiler größerer Art ist ;) |
Re: Kompilierender Matheparser
Hier ein Beispiel für 0^0, wo nicht 1 herauskommt. Ist zwar kein Beweis, aber immerhin ein Beispiel dafür, dass 0^0 nicht immer 1 ist:
Code:
für r Element R (rationale Zahlen)
f(x) = x^(r / ln(x))
Code:
Anmerkung: gegen 0+ deshalb, weil der Ln einer negativen Zahl ja komplex wäre
lim x->0+ f(x)
Hier haben wir eine unbestimmte Form 0^0. Lösen kann man das Ganze durch Logarithmieren:
Code:
wobei sich hier das ln(x) kürzt
Ln f(x) = r / ln(x) * ln(x)
Also im Limes:
Code:
und da r unabhängig von x ist, kommt hier r heraus. Da wir jetzt aber die logarithmierte Funktion haben, müssen wir diese wieder e^ nehmen, also:
lim x->0+ r
Code:
, wodurch sich der Limes ergibt:
e^r
Code:
, was man mit jedem besseren Taschenrechner (z.B. TI-92) nachprüfen kann
lim x->0+ f(x) = e^r
Dust Signs |
Re: Kompilierender Matheparser
Zitat:
\\Edit: Dein Beispiel ist schon sehr einleuchtend! Danke dir. Wieder was gelernt :) Zitat:
Zitat:
Zitat:
|
Re: Kompilierender Matheparser
@kirk_raynor: Ich hab als Übeltäter den PreSolver entlarvt, wird der ausgeschaltet funktioniert deine Formel ;-) Aber besser als ausschalten ist korrigieren, und das mach ich jetzt mal.
|
Re: Kompilierender Matheparser
So... jims Parsermörderformel funktioniert wieder, Echse und Soßen sind auf dem aktuellen (funktionierenden) Stand :)
|
Re: Kompilierender Matheparser
Und die Bugfixes nehmen kein Ende ;) Wieder eine von jims Parsermörderformeln "ausgebügelt" :)
|
Re: Kompilierender Matheparser
Neue Version - neues Glück.
Jetzt sind die Arcusfunktionen sind Real und Komplex auch eingebaut, danke Dusty :) Presolver sollte perfekt (:?) funktionieren, CaseSensitivity ist weg, in der Demo (jetzt im ersten Post) kann zwischen Komplex- und Real-Zahlenraum gewählt werden.. Und Operatoren entfernen funktioniert :oops: Da war so ein dummer kleiner Copy&Waste-Fehler drin. read you, Dax (auf Feedback hoffend ;)) |
Re: Kompilierender Matheparser
Gut ;)
1.) Bug in der Liste der Variablen: je öfter ich sie aufrufe, desto länger wird sie. Ich glaube, da hast du wo vergessen zu löschen ;) 2.) So, hier mal gleich ein paar Unterpunkte im Komplexen :mrgreen: a) sin(pi/2) funktioniert nicht, arctan(1) auch nicht - und etliche andere ebenfalls b) Wie gibt man die imaginäre Einheit an? Weder 1+i, noch 1+j funktioniert c) Ohne imaginäre Einheit kann ich leider nicht weiterrechnen ^^ 3.) arctan(1) funktioniert auch im reellen Zahlenraum nicht - auch nicht mit einem anderen Argument (z.B. 0,5) 4.) (e^2 - e^(-2))/2 ergibt nicht das selbe wie sinh(2) - da stimmt was nicht Bring mal diese Bugs raus, dann test ich weiter ;) Dust Signs |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Wenn ich das mit dem e raus hab, gibts ne neue Version..falls niemand schon vorher eine wollen sollte ^^ |
Re: Kompilierender Matheparser
@2a: nein. Außerdem sollte sin(pi/2) auch im Komplexen etwas anderes liefern als "Invalid expression"
@2b: funktioniert nicht Dust Signs |
Re: Kompilierender Matheparser
Zitat:
Zitat:
read you, Dax |
Re: Kompilierender Matheparser
wie wärs mit :
@2b: die von dir vorgeschlagene syntax wird nicht angenommen. scheint mir relativ klar zu sein, dax. :zwinker: |
Re: Kompilierender Matheparser
Das ist ja das Problem ;) Wenn ich in meinen Parser.. was weiß ich, zum Beispiel "sin(pi/2)i" eingebe, klappt das, genauso bei "1i+2i", "1+2i", "(pi)i" usw...
|
Re: Kompilierender Matheparser
Ich war eigentlich der Meinung, das folgendes auch funktionieren sollte (wäre logischer):
i 2*i pi*i sin(pi/2) nimmt dein Parser nicht ("Invalid expression"). Dust Signs |
Re: Kompilierender Matheparser
Zitat:
Zitat:
btw: Hast du die komplexe Arctan-Formel? Das wäre genial :) read you, Dax |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Dust Signs |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Edit: Neue EXE und Soßen sind oben, i ist jetzt eine Konstante. read you, Dax |
Re: Kompilierender Matheparser
Hallo,
ich mal wieder ;) Es gibt Leute die benutzen noch Delphi 5. Leider ist dein Code nicht ganz Delphi 5 Kompatibel aus folgenden Gründen: 1. in ECQ_Def:
Delphi-Quellcode:
wird in Delphi 5 nicht unterstützt. Hab es in
TParserMode = (pmReal = 1, pmComplex = 2, pmQuad = 4);
Delphi-Quellcode:
Ist es wirklich notwendig, dem pmQuad eine 4 zuzuweisen?
TParserMode = (pmReal, pmComplex, pmQuad);
2. gleiches Problem bei TRegister in ECQ_Assembler. Habs in
Delphi-Quellcode:
geändert, damit die Werte noch stimmen
TRegister = (rEAX, rECX, rEDX, rEBX);
3. Die Funktion Sign gibt es in Delphi 5 leider nicht. Habe Deshalb in EXCQP_Predefs die Funktion Sign manuell definiert:
Delphi-Quellcode:
4. Die Funktion Coth gibt es ebenfalls nicht :( Da ich diese Funktion vermutlich erstmal nicht brauche hab ich es auskommentiert. Vielleicht findet ja jemand Ersatz ...
function Sign(Value: double) : Integer;
begin if Value=0 then result:=0 else if Value<0 then result:=-1 else if Value>0 then result:=1; end; Auf jeden Fall, kann ich es jetzt mit Delphi 5 kompilieren ;) Wäre vielleicht schön, wenn du die Änderungen in deine Sourcen mit einbauen würdest. Dann geht es auch unter Delphi 5, das bestimmt noch einige benutzen. gruß vom nervendem jim ;) |
Re: Kompilierender Matheparser
hi jim, du nervst doch nicht ;)
Ich seh zu, das ichs ändere :) read you, Dax |
Re: Kompilierender Matheparser
Nächstes Problem: Wenn ich den Parser mit Free freigeben bekomme ich wieder unschöne AV. Ich weiss nicht ob es eine Rolle spielt aber hier mal der Code:
Delphi-Quellcode:
In RegisterVarsAndConst werden die entsprechenden Variablen mit
Parser:=TExCQParser.Create;
Parser.SolveMode:=smRM; Parser.PreSolve:=false; RegisterVarsAndConst(Parser); Parser.Parse('UnitTreff*(1/(Range*Range))*(BaseRange*BaseRange)'); Parser.Free;
Delphi-Quellcode:
registriert. Hoffe du kannst das Problem lösen bzw. erstmal nachstellen ;)
Parser.RegisterVariable(xxx)
|
Re: Kompilierender Matheparser
Danke jim, is korrigiert, neue Versionen oben :)
PS: Wenn du die Variablen und Konstanten eh am Anfang registrierst und nie löschst, leite doch vom ECQP ab und tu' alles in den Constructor ;) (Tip von Robert_G) read you, Dax |
Re: Kompilierender Matheparser
MMhh. Irgendwie ist der Wurm drin.
Habe jetzt zum Testen (wirklich nur zum Testen) folgendes:
Delphi-Quellcode:
Leider stürzt er bei dem Solve wieder zuverlässig ab. Da ist es egal welcher SolveMode aktiv ist, und ob PreSolve an oder aus ist :(
Parser:=TExCQParser.Create;
Parser.SolveMode:=smVM; Parser.PreSolve:=true; Parser.RegisterVariable('Range'); Parser.SetVariable('Range',[10]); Parser.Parse('(1/(Range*Range))'); ShowMessage(FloatToStr(Parser.Solve.X)); Parser.Free; P.S: Danke für den Hinweis mit dem Ableiten, allerdings hatte ich den Code etwas vereinfacht. In wirklichkeit lese ich die Formeln und die benötigten Variablen aus einer INI-Datei ;) |
Re: Kompilierender Matheparser
Hast du ne alte Version? :? Ich habs grad ausprobiert, es funktioniert ohne Probleme...
read you, Dax |
Re: Kompilierender Matheparser
sry schnell ne frage(ich hab jetzt nicht alels durchgelesen)
was sind imaginäre Werte? ... also nur vorgestellte werte - was hat dass für nen sinn(weil auch immer kommt ()i |
Re: Kompilierender Matheparser
Zitat:
Ich hab so das Gefühl, dass es an der Delphi Version hakt. Habs jetzt mal mit Delphi 5 und 7 getestet. Beides das gleich Problem :( Hab leider kein Delphi 2005 hier zum Testen. |
Re: Kompilierender Matheparser
Bei meinem Delphi 6 und 2005 funktionierts :?
Edit: Mein Demoprogramm verarscht mich. Mit der Demo gehts, mit dem Code nicht.. Mal sehn was da schief gelaufen ist. Edit2: Fehler beseitigt, neue Version :mrgreen: |
Re: Kompilierender Matheparser
Zitat:
Code:
; also unter uns gesagt ist i die Wurzel aus minus 1; ist nicht korrekt so, aber so lässt sich's leicht verstehen. Wenn du mehr dazu wissen willst, such einfach mal bei Google:
i^2 = -1
[google]Gauss'sche Zahlenebene[/google] [google]Imaginäre Einheit[/google] [google]Resonanz+Schwingkreis+Formel[/google] Dust Signs |
Re: Kompilierender Matheparser
Zitat:
Delphi-Quellcode:
Schreibt man es statt dessen in Klammern: (1*2) dann klappt es.
Parser:=TExCQParser.Create;
Parser.SolveMode:=smVM; Parser.PreSolve:=false; Parser.RegisterVariable('Range'); Parser.SetVariable('Range',[10]); Parser.Parse('1*2'); ShowMessage(FloatToStr(Parser.Solve.X)); Parser.Free; Hier scheint es also ein generelles Problem zu geben, wenn PreSolve false ist. Da ich den Variablen erst später einen Wert zuweise, aber die Formeln schon bei Programmstart kompiliere, bin ich auf PreSolve false angewiesen :( |
Re: Kompilierender Matheparser
Zitat:
Ich denke mal Dax hat das so eingebaut :) \\edit: Er macht also im Grunde aus "(x*2)+(sin(pi/2)*2)" --> "x*2+2" |
Re: Kompilierender Matheparser
Ich kam zwar noch nicht zum Testen. Aber der Code gefällt mir, wirklich hübsch geschrieben. :)
Das wollte ich nur mal loswerden... btw: Nach all dem Zitat:
Zitat:
|
Re: Kompilierender Matheparser
Zitat:
PS: Zitat:
read you, Dax |
Re: Kompilierender Matheparser
Zitat:
Dust Signs |
Re: Kompilierender Matheparser
Huhu :)
Also, hab den Fehler gefunden und korrigiert, danke ;) :arrow:
Delphi-Quellcode:
ThisThread.NewVersion; :mrgreen:
procedure ThisThread.NewVersion;
begin WriteLn('Korrigierte Version ist oben ;-)'); end; Zitat:
read you, Dax |
Re: Kompilierender Matheparser
weisst du, was genial wäre? wenn der parser gleichungen (bzw. eine seite einer gleichung) lösen (bzw. vereinfachen) könnte.
nur als kleine anregung :) |
Re: Kompilierender Matheparser
Sag mal ein konkretes Beispiel, dann überleg ichs mir :)
read you, Dax |
Re: Kompilierender Matheparser
(aus der heutigen mathe-hausafgabe, was aber REIN GAR NICHTS zur sache tut :mrgreen: )
(lg(x))² - lg(4x-4) = 0 jetzt eben entweder komplett nach x auflösen, so dass zum schluss L={x;y} dasteht oder die linke seite so weit wie möglich vereinfachen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz