Newtonsche Iteration

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Abend verehrte Community,

    Wie der Titel schon verrät geht es hier um das Newton Verfahren zur Annäherung an Nullstellen.

    Im Zuge einer Seminararbeit muss ich das ganze in Python berechnen können.
    Bevor Stimmen laut werden ich erwarte dass ihr meine "Hausaufgaben" macht, nein dem ist nicht so. Die Berechnung selber hab ich schon fast fertig, denn ich nutze dafür das numpy Modul.

    Mein Problem ist das einlesen der Funktion.
    Ich verwende die Polynom Klasse des Numpy Moduls zur Berechnung.

    http://docs.scipy.org/doc/numpy/refe…als.poly1d.html

    Bisher habe ich die einzelnen Parameter eingelesen nach dem Motto

    f(x) = ax⁴+ bx³ + cx² + dx + e

    "Bitte geben sie a ein"

    bis alles bis e abgefragt wurde.
    Das trage ich dann in eine Liste ein und definiere damit mein Polynom

    f = numpy.poly1d([a, b, ...])

    Und ich hätte es gerne so dass man das Polynom auf einmal eingibt wie

    "Bitte geben Sie die Funktion ein:"

    5x⁴ - 3x³....

    Es geht mir also eigentlich um den puren Komfort beim eingeben, und das Programm soll ja auch später angenehm beim bedienen sein.

    Ich hoffe ihr konntet mir folgen und falls etwas unklar ist dann sagt mir einfach Bescheid.
    Ich erwarte hier auch keinen fertigen Code sondern nur ein paar Tipps oder Hinweise.

    Ich hab schon in dem Python Buch auf Galileo Computing geschaut aber war da nicht so erfolgreich aber falls ihr Quellen, Tutorials oder Foreneinträge zu dem Thema habt postet sie bitte.

    schonmal danke für eure Hilfe!

    Mfg Zechpreller

    PS: Rechtschreibfehler sind sehr wahrscheinlich also habt Mitleid :)


  • Die Lösung Deines Problems könnten die regulären Ausdrücke sein. Damit kannst Du z.B. einen String nach bestimmten Regeln untersuchen und auch zerlegen.

    Und was bringt das?

    Zechpreller
    Mach dich mal schlau über rekursive Funktionen.

    EDIT:

    Sry raspiprojekt, ich hab da Zechprellers Frage nicht zu ende gelesen. Ihm geht es um die Eingabe und nicht die primär um die Berechnung.

  • Und was bringt das?

    Zechpreller
    Mach dich mal schlau über rekursive Funktionen.


    Nun wie Du sicher aufmerksam gelesen hast, geht es in dem Thread nicht um die rekursiven Funktionen, sondern um die komfortable Eingabe des Polynoms und das geht mit der Zerlegung der Formel nach der Eingabe mit Hilfe der regulären Ausdrücke sehr gut. Also bevor Du hier rumeierst und Dich für oberschlau hälts, solltest Du vielleicht erst vernünftig lesen und dann Deinen Senf dazugeben!

    Zitat

    Sry raspiprojekt, ich hab da Zechprellers Frage nicht zu ende gelesen. Ihm geht es um die Eingabe und nicht die primär um die Berechnung.


    Dann nehme ich meinen bösen Satz, der Dich genau darauf hinweist natürlich zurück. Schnellschießer :lol:

  • Das sieht sehr vielversprechend aus danke dafür!

    Ist immer schwierig im Eigenstudium das herauszufinden und meine Frage ist doch sehr speziell.
    Ich les mich da mal ein und melde mich dann wieder!

    Diese Community hier ist wirklich der Hammer, man kriegt immer sofort ne Antwort!


  • Ich versuche Regexp ja immer zu meiden wo es geht, ich verbringe mehr Zeit damit in Live-Regexp-checkern die richtige Syntax zusammen zu basteln als ich für den eigentlichen code brauche :lol:


    Hast Du einen Link zu so einem Checker? Das würde Zechpreller evtl. helfen sich damit zu beschgäftigen.

  • Hallo zusammen,
    Zechpreller:
    ich habe mich vor Jahren auch einmal mit regexes auseinandergesetzt. Aber die TUTs waren so lala.
    Dies [url=http://danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke]HIER[/url] war das beste, meiner Meinung nach. Gut erklärt, gute Beispiele.

    Viel Glück

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Vermutlich ist die Kombination - wie dbv schon schrieb - von String Methoden und regex am effizientesten. Die full blown Methode wäre mit einem richtigen Parser, z.B. PLY (da brauchst Du aber auch regex Kenntnisse). Vielleicht hast Du ja mal irgendwann später Lust Dich damit zu befassen :)

  • Also ich sitze jetzt wirklich schon seid gestern Nachmittag dran habs mir auch ausgedruckt und im Freibad gelesen :), und es is wirklich nicht ohne aber ich beiß mich einfach mal durch

    bootsmann falls jemand das Programm "Turboplot" kennt so ähnlich sollte die Eingabe aussehen also z.B.

    5x³+2x²+4x+6 (=> das Polynom)
    Ich brauche ja nur die Faktoren vor den Exponenten die werden anschließen über die Numpy Klasse poly1d eingelesen.
    (Der Link dazu ist in meinem ersten Beitrag)

    und eingeben wie 5x^3+2x^2+4x+6

    Da stoße ich schon auf mein erstes Problem wie sieht das als regex denn aus? Immerhin wird ja ^ zum negieren von Literalen verwendet.

    Oder wäre es hier vl. schlauer die von Python verwendete Form mit 5x**3+2x**2+4x+6
    Die Eingaberegeln könnte ich ja vorher erklären damit würde ich mir vl. einen haufen stress ersparen.

    Und dann kommen ja noch solche Späße wie e & ln-funktion dazu.
    Ich muss da wirklich noch einiges machen.

    Einmal editiert, zuletzt von Zechpreller (11. Juni 2014 um 12:57)

  • und warum zerlegst du das nicht als String ?

    ferner wäre es IMHO sinnvoll 5x^3+2x^2+4x+6 zu

    5x^3+2x^2+4x^1+6x^0

    zu erweitern

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • So rein auf die Schnelle würde ich das so machen:

    Code
    # coding: utf-8
    
    
    formel = "5x^3+2x^2+4x+6"
    x = 5
    print eval(formel.replace('^', '**').replace("x", "*x"))

    Stimmt zwar nicht ganz wegen fehlenden Klammern, aber meiner Meinung nach wie schon erwähnt wäre hier ggf die hauseigenen String-Methoden effizienter.

    EDIT:
    Sicherlich auch noch ein Blick wert:
    http://docs.sympy.org/latest/tutorial/index.html

    EDIT II:

    Zitat

    As long as you can make do with str.replace(), you should use it. It avoids all the pitfalls of regular expressions (like escaping), and is generally faster.
    Quelle

  • Hey,

    musste während dem Studium in Systemnaher Programmierung einen Compiler für eine Pseudoprogrammiersprache unseres Profs schreiben. Zum einlesen des Codes bzw. zum erkennen der Befehle, Werte, etc. wurden Moore- oder Mealy-Automaten benutzt. Vllt hilft es dir ja, vllt wäre es aber auch einfach ein Overkill.

    Zu dem Problem mit dem "^"..du könntest nach der Eingabe den String auf "^" durchsuchen und sie einfach durch "**" ersetzen.
    Bin jedoch nicht so der Pyhtonprogrammierer, also kenne die von dir verwendeten Bibliotheken nicht und weiß nicht ob es da zu anderen Problemen kommen könnte.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!