komplexe Nullstellensuche



  • Hallo! Ich hab folgendes Programm, welches die Nullstelle einer beliebigen komplexen Zahl ausrechnet! Er tut es zwar auch aber es kommen falsche Werte raus, d.h. er durchläuft die do while schleife ca. 500 mal und am Ende kommt dann das Ergebnis (-1# IND,-1#IND) raus, jedesmal! Dass heisst es muss irgendwo ein kleiner Fehler drinnen sein, aber ich weiss nicht wo !

    Die komplexen Operatoren + und / stimmen, die hab ich vom Aufgabenblatt so, auch die Berechnung des Betrags stimmt und die Newton-Iteration ist Zn+1 = Zn - f(Zn)/f'(Zn) also müsste das auch richtig sein !

    Die Funktion ist f( z ) = z^2+1 die Ableitung davon f'( z ) = 2*z. Normalerweise soll das Programm solange die schleife durchlaufen bis der Betrag von Zn+1 - Zn < eps ist.

    Vermutlich ist irgendwo ein Syntax Fehler weil sonst eigentlich alles ist, wie auf der Vorgabe, aber ich finde den Fehler einfach nicht!

    #include <iostream.h>
    #include <math.h>
    struct complex 
    {
      double re,im;
    };
    
    istream& operator>>(istream& is, complex& c)
    {
     char klauf, komma, klzu;
     is >> klauf >>c.re >> komma >> c.im >> klzu;
     return is;
    }
    
    ostream& operator<<(ostream& os, complex c)
    {
     os <<"["<<c.re<<","<<c.im<<"]";
     return os;
    }
    
    complex operator-(complex a, complex b)
    {
     complex erg;
     erg.re=a.re-b.re;
     erg.im=a.im-b.im;
     return erg;
    }
    complex operator/(complex a, complex b)
    {
     complex erg;
     erg.re=(a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im);
     erg.im=(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im);
     return erg;
    }
    
    complex f(complex z)
    {
     z.re=(z.re*z.re)+1;
     z.im=(z.im*z.im)+1;
     return z;
    }
    
    complex df(complex z)
    { 
     z.re=z.re+z.re;
     z.im=z.im+z.im;
     return z;
    }
    
    double betrag(complex z)
    { 
      double b;
      b=sqrt(z.re*z.re+z.im*z.im);
     return b;
    }
    
    complex newton(complex z)
    {
      complex znp,zn;
    
      zn=z-f(z)/df(z);
    
      znp=zn-f(zn)/df(zn);
    
    return znp;
    }
    
    int main()
    {
     int i=0;
    
     complex c,z,zb;
     double eps;
    
     cout <<"Geben sie eine Abbruchsschranke epsilon an: " <<endl;
     cin >>eps;
    
     cout <<"Komplexe Zahl eingeben: " <<endl;
     cin >>c;
    
     do
     {
     z=c;
     c=newton(c);
     i++;
     zb=c-z;
     }
     while( betrag(zb) >= eps);
    
     cout <<"Nullstelle gefunden bei: " <<c <<endl;
     cout <<"Anzahl der Iterationen: " <<i <<endl;
    
    cin >>eps;
    return 0;
    }
    

    Danke!



  • einmal ohne mir den code ganz anzusehen:
    kennst du den typ std::complex aus der headerdatei <complex>?
    bevor du alles selbst mach, lass doch die standardbibliothek für dich arbeiten 😉



  • Naja schön und gut, nur: ich muss das als Aufgabe bearbeiten und da muss ich das selbst von han dmachen, weil ich darüber auch ne Klausur schreiben muss! Da helfen mir Standart Bibliotheken leider nicht viel 😞



  • Das muss <iostream> und <cmath> heißen. Die Standard-Header haben kein .h am Ende. 🙂
    Warum darfst du std::complex nicht benutzen? Das gehört zu Standard-C++, wie class und while. 🙄



  • Weil es wahrscheinlich nicht viel dazu beiträgt, sein Wissen um Algorithmik zu erweitern. 😃



  • Naja bringt mir herzlich wenig über den Sinn oder Unsinn dieser Aufgab ezu diskutieren 😉 ich muss es eben nunmal machen!



  • Kann ich irgendwo verstehen, ich lös Probleme auch gerne selber um zu sehen ob
    ich es kann und verwende erst danach die Standardfunktionen.



  • Ich hab im Lauf der Zeit festgestellt, dass man einfach zu nichts kommt, wenn man alle Standard-Probleme selber löst (z.B. sortieren).
    Aber ich weiss, dass ich es kann, das ist immer gut zu wissen. Aber ich weiss auch, dass ich es nicht besser kann. 🕶



  • Optimizer schrieb:

    Ich hab im Lauf der Zeit festgestellt, dass man einfach zu nichts kommt, wenn man alle Standard-Probleme selber löst (z.B. sortieren).
    Aber ich weiss, dass ich es kann, das ist immer gut zu wissen. Aber ich weiss auch, dass ich es nicht besser kann. 🕶

    Eben genau darum mach ich es einmal selber um zu sehen ob ich es kann, verwende
    danach aber den Standard.



  • hmm vielleicht ist das nicht deutlich rübergekommen, aber ich muss dass für die Uni machen ... MUSS ...dass heisst ich muss das schreiben und abgeben, Und es wird halt gefordert das selbst zu machen und keine Standard Funktionen zu nutzen, würd ich das privat machen, würd ich mich damit nicht abquählen! Es wird halt auch nicht nur geguckt obs funzt sondern es wird auch in den Quellcode geschaut, ob da alles stimmt, daher muss ich das halt nun mal eben auf dem hölzernen Weg machen. Mal davon abgesehen, arbeitret das prgramm ja und im Prinzip ja auch fast richtig, es muss wie gesagt ein kleiner Fehler drinne sein, das is eigentlich alles was ich bräuchte da ich da einfach nimmer weiterkomme! Gut hab jetzt auch den halben Tag dran gearbeitet, werd halt mal drüber schlafen 😉



  • so, nun beiss dich mal sonst wo 😉

    ... nachdem du dir deine funktion zum dividieren mal angesehen hast 🙂

    da hast du irgendwas mächtig durcheinander gewürfelt!



  • ÄRKS

    man ok innen hintern werd ich mich nich beissen....eher in den Hintern des Aufgabenstellers ! auf dem Aufgaben blatt steht bei z1/z1 ...+ i b1a2 ...
    dabei isse sgrad andersrum bämlich b2
    a1....toll da hat man die Aufgabe richtig gelöst aber wegen so nem dummen fehler im Aufgabenblatt...grml...naja danke für den Tipp, dank freund Google hab ich das richtige gefunden 😉


Anmelden zum Antworten