Lösen beliebiger Gleichungen



  • Kannst du die Funktion nicht Plotten also f(x) = sqrt(x) + sin(x) - 8
    Dann die Anzahl der Nullstellen ablesen. Für jede ein Intervall wählen und dann mit nem Intervallschachtelungsverfahren arbeiten ? ( zB ganz einfache Intervallhalbierung ). ( klar musst du beim plotten wohl einen zu Plottenden Bereich wählen, bei dieser funktion wird wohl über x=90 und unter x=0 keine Nullstelle liegen )

    Ich hab sowas zwar noch nicht Progammiert aber so überprüfe ich komplizierte Funktionen auf ihre Lösungsanzahl.

    MFG ch



  • Wobei Maple bei der Gleichung auch nicht grade glorreiche Ergebnisse auswirft:

    solve (sqrt(x) + sin(x) = 8, x);
                                      2
                   RootOf(_Z - sin(_Z)  + 16 sin(_Z) - 64)
    

    _Z steht glaube ich für einen Integer Wert.

    Welches Programm kann denn solche Gleichungen zufriedenstellend lösen ?



  • c°h° schrieb:

    Welches Programm kann denn solche Gleichungen zufriedenstellend lösen ?

    Also ein Programm, was die Gleichung zufriedenstellend lösen kann kenne ich nicht. Derive hat eine einzige Lösung ausgespuckt. Wenn man sich aber den Graphen von sqrt(x) + sin(x) - 8 ansieht, so sieht man, dass die Funktion mehrere Nullstellen hat. Es gibt also mehrere Lösungen...



  • Es muss doch dann auch möglich sein die Startintervalle anhand des Graphs so zu wählen, dass jeweils eine Nullstelle in jedem Intervall liegt. Die Abschätzung der zu plottenden Range stelle ich mir schon schwerer vor. Aber das könnte man ja auch den User definieren lassen zB suche Lösungen zwischen 0 und 1. Dann genügt es den Graphen über [0,1] zu plotten.

    mfg



  • Hmmm... Dazu müsste der Benutzer aber abschätzen können, wo Lösungen liegen könnten. Gibt es nicht ein allgemeines Verfahren?



  • Ich kenne kein Verfahren das alle Lösungen jeder beliebigen Gleichung ausgibt.

    Allerdings müsste der User doch schon abschätzen können in welcher Range sinnvolle Ergebnisse liegen da das Lösen solcher Gleichungen ja meistens eine Praxisanwendung ist. In der Theorie muss man sowas selten lösen.

    Wenn es dann keine Lösungen in der Range gibt existiert eben keine sinnvolle Lösung. ( eine nichtsinnvolle Lösung wäre zB ein negativer Zinssatz etc )



  • Wie gesagt, das ist beliebig schwer, es gibt kein Verfahren, das immer funktioniert. Falls es Dir schwer fällt das zu glauben, vielleicht kannst Du eher glauben, daß es sehr schwer ist ein globales Minimum einer Funktion zu finden. Minimieren bedeutet aber gerade Ableiten und Nullstellen suchen. Könnte man nun gut Nullstellen finden, könnte man auch gut optimieren. Aber auch dafür sind fast nur Näherungsverfahren bekannt oder eben gute Verfahren, die sich dann aber nur für spezielle Probleme eignen.



  • Ok. Dass es kein allgemeines Verfahren gibt war mir schon klar. Aber häufig kann man mit ein wenig Analyse, ein Bisschen probieren und ein paar Tricks mehr erreichen, als es zuerst den Anschein hat. Ich dachte eher an sowas in der Richtung...



  • Ja, mit scharfem Hingucken kann man in einigen Fällen tatsächlich eine Lösung finden. Aber ein Computer kann nicht "scharf hingucken", der kann höchstens einen Satz Regeln durchgehen und überprüfen, ob eine davon auf sein Problem anwendbar ist.

    Eine Möglichkeit zur Berechnung aller Nullstellen wäre so etwas:

    vector<double> solve;
    for(double x=-minx;x<maxx;x+=stepx)
      if(f(x)*f(x+stepx)<0) // im aktuellen Intervall ist eine Nullstelle
      {
        double x0 = Nullstelle(f,x,x+stepx);//Intervallhalbierung o.ä.
        solve.push_back(x0);
      }
    

    (da mußt du nur minx, maxx und stepx so justieren, daß du den gesamten Definitionsbereich der Funktion erfasst)



  • Udn stepx so klein wählen, daß es nicht zwei Nullstellen überspringt. Das ist wohl das schwierigste daran. Wenn man allerdings Zusatzwissen über die Funktion hat, dann kann das schon gehen.



  • CStoll schrieb:

    Eine Möglichkeit zur Berechnung aller Nullstellen wäre so etwas:

    vector<double> solve;
    for(double x=-minx;x<maxx;x+=stepx)
      if(f(x)*f(x+stepx)<0) // im aktuellen Intervall ist eine Nullstelle
      {
        double x0 = Nullstelle(f,x,x+stepx);//Intervallhalbierung o.ä.
        solve.push_back(x0);
      }
    

    Bei stetigen Funktionen wirst Du damit Erfolg haben. Bei Funktionen mit Definitionslücken ooder solchen, die nur in bestimmten Intervallen definiert sind kann das schnell schiefgehen.

    Beispiel: f(x) = 1/x
    f(-1) = -1, f(1) = 1 => f(1)*f(-1) = -1 < 0, und das obwohl keine im Intervall von -1 bis 1 vorliegt.


Anmelden zum Antworten