![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| /(bb|[^b]{2})/ Registriert seit: 05.11.2006
Beiträge: 29
|
Hi@all! Ich habe ein kleines Prob. Und zwar habe ich diesen Code: PHP-Code: Der soll für eine Gleichung, die ich eingebe, die x durch $null ersetzen und davor ein* hinzufügen, falls da kein +-*/ steht. Leider kriege ich immer, wenn ich ihn ausführe, einige Warnungen und Notizen, dass in Zeile soundso (je nach Gleichung) der Offset undefiniert ist und in der Funktion strpos() der Offset nicht funktioniert. Wenn ich in Zeile 27 die and durch or ersetze, kriege ich keine Meldungen, aber dann fügt der in jedem Fall ein * vor dem x ein, auch wenn da ein+-*/ steht. Kann mir jemand helfen? Greetz, Ilinsekt Geändert von Ilinsekt (05.11.2006 um 15:00 Uhr). |
| | |
| | Nach oben #2 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Hallo und willkommen im Forum. Du kannst deine Beiträge editieren. Bitte tu dies und nutze die PHP-Tags. Danke dir. Danach schaue ich mir dein Problem auch an. Grüße, Ben. [EDIT] Danke, ich schau mal. Geändert von Ben (05.11.2006 um 13:24 Uhr). |
| | |
| | Nach oben #3 | |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Äh, ja. Also ich erhalte das hier Code: y = x^2........y = *$null^2+0-0/1*1.......y = *pow($null,2)+0-0/1*1 Der Code ist recht wirr, da nicht wirklich dokumentiert. Zitat:
Was genau ist dein Fehler? (Muss gestehen, dass ich mich jetzt nicht intensiv damit befasst habe .. mich hat die Lust verlassen, als ich den Code gesehen hab Kannst du uns eventuell sagen, wann genau du eine Meldung erhälst? Danke. Grüße, Ben. | |
| | |
| | Nach oben #4 | |||
| /(bb|[^b]{2})/ Registriert seit: 05.11.2006
Beiträge: 29
|
Wenn ich eingebe: 25x^23+5*x^2 sollte er das in 25*pow($null,23)+5*($null,2) umwandeln, d.h. wenn kein +-*/ vor dem x steht, soll er ein *-Zeichen hinzufügen. Bei dieser Gleichung erhalte ich folgendes: Zitat:
Zitat:
Greetz, Ilinsekt Geändert von Ilinsekt (05.11.2006 um 15:08 Uhr). | |||
| | |
| | Nach oben #5 |
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 397
|
ALso ich habe deinen Code ausprobiert und versucht, ihn zu verstehen, aber ich glaube, dass du leider auf dem falschen Dampfer bist. Denn sobald du eine Funkton vom Format [i}y=(24+x)^4-x(5+x)[/i] bekommst, wirst du ein Problem haben. Ich würde folgendermaßen vorgehen: Zuerst würde ich eine Art Hierarchie der Funktion entwerfen entsprechend den Zugehörigkeiten der einzelnen Teile. Für unsere Beispielfunktion sähe diese Hierarchie folgendermaßen aus: (in geschweiften Klammern nach dem Wort "Array" immer der Teil auf das sich das Array bezieht) Code: $function =
Array { (24+x)^4-x(5+x) }
[0] => Array { (24+x)^4 }
[0] => Array { 24+x }
[0] => 24
[1] => x
['Konnektor'] => +
[1] => 4
['Konntektor'] => ^
[1] => Array { x(5+x) }
[0] => x
[1] => Array { 5+x }
[0] => 5
[1] => x
['Konnektor'] => +
['Konnektor'] => *
['Konnektor'] => -
( aus 25+x+3 wird 28+x ) Ich kann dir jetzt nicht sagen, wie du das exakt machen kannst, aber im Grunde funktioniert es so. Ich würde so vorgehen: Zuerst würde ich alle Leerstellen aus der Gleichung entfernen. Anschließend würde ich alle ax bzw. xa zu a*x bzw. zu x*a umwandeln. Danach würde ich alle Zugehörigkeiten anhand von Klammern in eine Hierarchie umwandeln. Dann würde ich innerhalb der gleichen Ebene (in der gleichen Klammer) nach gleich starken Verknüpfungen suchen und sie zusammenfassen. ( 4+(5+x) ist legitim (4+5+x) nicht!! ) Danach könnte man die Hierarchie von vorhin aufstellen. Und dann würde ich daran gehen, die x durch $null zu ersetzen und die einzelnen Operatoren durch ihre Entsprechung in PHP Und dann alles wieder zusammensetzen, wobei Ebenen geklammert werden. Tadaaa! Fertig. Noch dabei? Gut, weil ich nämlich fast nicht mehr Also ich fände es eine Herausforderung. Helfen würde dir dabei die Funktion preg_match_all sowie weitere pref-Funktionen. Und vielleicht auch das Tut über Rekursion Grüße, Jojo
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
| | |
| | Nach oben #6 |
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 397
|
Also ich lag gestern noch lange wach, weil mich ein ungutes Gefühl bei meiner Antwort plagte. Am Ende habe ich dann doch nen Fehler gefunden. Mit meiner Technik hast du leider folgenden Fall nicht abgedeckt: Code: y=(23+x)^3+2x^2+2 Zuerst trennst du wie gehabt die Gleichung nach Klammern auf. Dann erstellt du auf dieser Basis davon einen Hierarchiebaum, mit jeweils zwei Elementen. mehrere gleiche Verknüpfungen würde ich wie folgt aufbauen: x^3+x^2+x wird zu Code: Array [0] => x^3+x^2 [1] => x ['Konnektor'] => + Code: Array
[0] => Array
[0] => x^3
[1] => x^2
['Konnektor'] => +
[1] => x
['Konnektor'] => +
So hast du nicht das Problem, zusammenfügen zu müssen und behälst doch die binäre Struktur bei. Dann fängst du an, aufgrund deines "Klammerbaumes" die Elemente aufsteigend nach ihren Verknüpfungen immer mehr zu unterteilen, bis du zu einem Baum wie in meinem Thread vorher kommst. Dann entsprechend ersetzen und fertig.
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
| | |
| | Nach oben #7 |
| /(bb|[^b]{2})/ Registriert seit: 05.11.2006
Beiträge: 29
|
Also, danke erstmal für die Antworten! Mein ursprüngliches Problem habe ich jetzt gelöst, es hat eine else-Struktur gefehlt. Nun zu deiner Idee, Jojo: Ich finde, das ist unnötig, da PHP die Klammerregeln kennt. Ich werde meinen Code halt etwas umbauen müssen, á la wenn vor dem Cirkoflex eine Klammer steht, dann sucht er die vorherige Position einer öffnenden Klammer und ersetzt die Klammern und die Potent durch pow(Klammerinhalt z.B. 5+$null,Potenz z.B. 4). Es geht darum, in der Stringvariable $xpotenz einen gültigen PHP-Code als String zu speichern, sodass ich ihn mit eval() nutzen kann. Greetz, Ilinsekt |
| | |
| | Nach oben #8 |
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 397
|
Mir ist klar, dass PHP Klammern kennt. Nur könntest du eventuell Schwierigkeiten bekommen, wenn du damit bestimmte Funktionen ausführst. Aber nun gut, war ein Vorschlag. Kann man sicherlich auch anders machen. Grüße, Jojo
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
| | |
| | Nach oben #9 |
| /(bb|[^b]{2})/ Registriert seit: 05.11.2006
Beiträge: 29
|
Der Code ist jetzt soweit fertig, dass er die Gleichung in PHP-Code übersetzt, auch wenn vor der Potenz Klammern oder Zahlen stehen. eval() funktioniert auch, fehlt nur noch die Bestimmung der Nullstelle, was aber einfach sein dürfte, da ich den dafür nötigen Code bereits auf meinem Taschenrechner (Texas Instruments TI 82 Stats, bin jetzt 10. Klasse, da kriegt man sowas) programmiert habe, muss ihn nur noch für PHP abschreiben. Falls es dich interessiert, hier mein Code soweit: PHP-Code: |
| | |
| | Nach oben #10 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
kleiner Tipp. Da ich die Test-Datei mal nicht 405.php genannt habe als ich das gerade getestet habe.... $_SERVER['PHP_SELF'] sollte da helfen! Des weiteren: Wenn ich als Gleichung folgendes eingebe: x^8+x^7+x^6+x^5+x^4+x^3+x^2+x^1+x^0=0 dann bekomme ich lauter dir bekannte Fehler! Aber du sagtest ja, dass der Code schon funktioniert - daher mein Einwand an dieser Stelle. Bis zu welchem Grad funktioniert denn dein Skript? Ich durfte sowas in diesem Jahr in C++ programmieren. Bei mir waren das rund 1000 Zeilen Code, darum bin ich über deine paar Zeilen ein wenig verwundert! Und dann gleich noch eine Frage. Berücksichtigst du auch komplexe Nullstellen? // edit: Nachtrag: Ich finde die Darstellung der Lösungen ... unübersichtlich!
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #11 |
| /(bb|[^b]{2})/ Registriert seit: 05.11.2006
Beiträge: 29
|
Danke für den Tipp, ich habe in meinem Code nur die Variante dass das Gleichheitszeichen am Anfang der Gleichung steht. Wenn du es so eingibst, funktioniert alles. Die Bestimmung der Nullstelle (Ich sage jetzt Bestimmung und nicht Berechnung, weil die Nullstelle durch Ausprobieren ermittelt werden soll, da du bei ganz-rationalen Gleichungen n-ten Grades, wobei n größer als 2 ist, erstmal eine Nullstelle durch ausprobieren bestimmen musst) ist noch nicht drin. Die Darstellung der Lösungen ist unübersichtlich, weil das eigentlich nur für mich zum Nachprüfen ist, ob alles funktioniert. Wenn alles einwandfrei ist, werde ich es natürlich übersichtlicher machen. Das, was du meinst, ist die Polynom-Division, die will ich eigentlich auch machen, in den Weihnachtsferien z.B. Naja, mal sehen, ob das was wird. Komplexe Zahlen hatten wir noch nicht, daher weiß ich nicht, wie ich das machen soll. Wenn wir das durchnehmen, schau ich mal, ob ich das hinkriege. Geändert von Ilinsekt (09.11.2006 um 21:30 Uhr). |
| | |
| | Nach oben #12 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
mmh.. dann wäre es ggf. hilfreich ein Eingabe-Beispiel mitzugeben. eine Möglichkeit durch ausprobieren ist durchaus möglich. Wenn diese zu einem richtigem Ergebniss kommt spricht von meiner Seite aus nichts dagegen, das dann berechnen zu nennen. Als Ratschlag gebe ich dir mal folgendes: Such mal nach der Nullstellenberechnung mit dem Newton-Verfahren. Jedenfalls dann, wenn du bereits Differentialrechnung hattest - ich weiß ja nicht, wieweit du schon in der Schule bist. Zusammen mit der Laguerre-Methode kann man da feine Sachen machen.. Wobei ich dir letzteres erst für spätere Zeiten empfehlen kann.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |