Näherungsverfahren Funktionen 3. Grades



  • Ich bin eigentlich fertig mit dem Programm, es muss nur noch optimiert werden. Leider hab ich das Problem, wenn es keine weitere Nullstelle gibt, funktioniert es nicht. Aber guckt selbst:

    // Wolframm, 21.5.2007, all rights reserved
    #include <iostream.h>
    #include <conio.h>
    #include <iomanip.h>
    #include <math.h>
    int main()
    { int x;
      double a,b,c,d,e,f[2],g[3],y,xh;
      cout<<"    x³     x²      x   ";
      gotoxy(1,1); cin>>a;
      gotoxy(9,1); cin>>b;
      gotoxy(16,1); cin>>c;
      gotoxy(22,1); cin>>d;
    
      x=1000;
      y=a*pow(x,3)+b*pow(x,2)+c*x+d;
      //y=-pow(x,3)+x-3;
      if(y<=0) 
      { //1
        g[0]=-1000;g[1]=-1000;g[2]=-1000;
        x=-500;
        do
        { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
          //y=-pow(x,3)+x-3;
          if(y<=0)
          { f[0]=x;
            f[1]=x-1;
          }
          x=x+1;
        }while(y>=0);
    
        e=1000;
        do
        { xh=(f[0]+f[1])/2;
          y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
          //y=-pow(xh,3)+xh-3;
          if(y<=0)
          { f[0]=xh;
          }
          else
          { f[1]=xh;
          }
          e=e-1;
        }while(e!=0);
        g[0]=xh;
    
        //2
        f[0]=-1000;f[1]=-1000;  
        x=xh;
        x=x+1;
        e=1000;
        do
        { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
          //y=-pow(x,3)+x-3;
          if(y>=0)
          { f[0]=x;
            f[1]=x-1;
          }
          x=x+1;
          e=e-1;
        }while((y<=0)||(e==0));
        //cout<<x;
        xh=-1000;
        if(f[0]!=-1000) 
        { e=1000;
          do
          { xh=(f[0]+f[1])/2;
            y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
            //y=-pow(xh,3)+xh-3;
            if(y>=0)
            { f[0]=xh;
            }
            else
            { f[1]=xh;
            }
            e=e-1;
          }while(e!=0);
        }
        if(xh!=-1000)
        { g[1]=xh;
        }
        else
        { g[1]=-1000;
        }
    
        //3    
        f[0]=-1000;f[1]=-1000;  
        x=xh;
        x=x+1;
        if(xh!=-1000) 
        { e=1000;
         do
          { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
            //y=-pow(x,3)+x-3;
            if(y<=0)
            { f[0]=x;
              f[1]=x-1;
            }
            x=x+1;
            e=e-1;
          }while((y>=0)||(e==0));
    
          e=1000;
          do
          { xh=(f[0]+f[1])/2;
            y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
            //y=-pow(xh,3)+xh-3;
            if(y<=0)
            { f[0]=xh;
            }
            else
            { f[1]=xh;
            }
            e=e-1;
          }while(e!=0);
        }
        if(g[1]!=-1000)
        { g[2]=xh;
        }
        else
        { g[2]=-1000;
        }  
      }
      else
      { //1
        g[0]=-1000;g[1]=-1000;g[2]=-1000;
        x=-500;
        do
        { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
          //y=-pow(x,3)+x-3;
          if(y>=0)
          { f[0]=x;
            f[1]=x-1;
          }
          x=x+1;
        }while(y<=0);
    
        e=1000;
        do
        { xh=(f[0]+f[1])/2;
          y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
          //y=-pow(xh,3)+xh-3;
          if(y>=0)
          { f[0]=xh;
          }
          else
          { f[1]=xh;
          }
          e=e-1;
        }while(e!=0);
        g[0]=xh;
    
        //2
        f[0]=-1000;f[1]=-1000;  
        x=xh;
        x=x+1;
        e=1000;
        do
        { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
          //y=-pow(x,3)+x-3;
          if(y<=0)
          { f[0]=x;
            f[1]=x-1;
          }
          x=x+1;
          e=e-1;
        }while((y>=0)||(e==0));
    
        xh=-1000;
        if(f[0]!=-1000) 
        { e=1000;
          do
          { xh=(f[0]+f[1])/2;
            y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
            //y=-pow(xh,3)+xh-3;
            if(y<=0)
            { f[0]=xh;
            }
            else
            { f[1]=xh;
            }
            e=e-1;
          }while(e!=0);
        }
        if(xh!=-1000)
        { g[1]=xh;
        }
        else
        { g[1]=-1000;
        }
    
        //3    
        f[0]=-1000;f[1]=-1000;  
        x=xh;
        x=x+1;
        if(xh!=-1000) 
        { e=1000;
         do
          { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
            //y=-pow(x,3)+x-3;
            if(y>=0)
            { f[0]=x;
              f[1]=x-1;
            }
            x=x+1;
            e=e-1;
          }while((y<=0)||(e==0));
    
          e=1000;
          do
          { xh=(f[0]+f[1])/2;
            y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
            //y=-pow(xh,3)+xh-3;
            if(y>=0)
            { f[0]=xh;
            }
            else
            { f[1]=xh;
            }
            e=e-1;
          }while(e!=0);
        }
        if(g[1]!=-1000)
        { g[2]=xh;
        }
        else
        { g[2]=-1000;
        }
      }
    
      cout<<setprecision(15)<<g[0]<<endl; 
      if(g[1]!=-1000)
      { cout<<setprecision(15)<<g[1]<<endl;
      }
      else
      { cout<<"Es gibt keine weitere Nullstelle!"<<endl;
      } 
      if(g[2]!=-1000)
      { cout<<setprecision(15)<<g[2]<<endl;
      }
      else
      { cout<<"Es gibt keine weitere Nullstelle!"<<endl;
      } 
    
     /* cin>>x;
      y=-pow(x,3)-2*x+2;
      cout<<y;*/
    
      getchar();
      return 0;
    }
    

    Bei //2 steht while((y<=0)||(e==0)); und das müsste eigentlich bedeuten, dass die Schleife gilt solange y kleiner gleich 0 ist oder e gleich 0 wird. Leider hört die Schleife bei e=0 nicht auf und desswegen wird das Programm nicht beendet. Was kann ich tun? Eigentlich müsste doch das || "Oder" ausdrücken.

    P.S.: Es wurde mit C++ Trainer programmiert.



  • Die Oder-Bedingung ist erfüllt, solange wenigstens einer der Teilausdrücke erfüllt ist - das heißt, solange der Teil y<=0 gilt, spielt der Wert von e keine Rolle. Du benötigst hier als Abbruchbedingung 'while(y<=0 && e!=0)'.

    PS: Warum nur eine Näherungslösung suchen? Für Gleichungen dritten Grades gibt es doch auch eine exakte Lösungsformel.



  • Sorry für die direkte Kritik aber:

    Wenn ich sowas sehe wird mir schlecht: pow(x,2)



  • megaweber schrieb:

    Sorry für die direkte Kritik aber:

    Wenn ich sowas sehe wird mir schlecht: pow(x,2)

    Weil? meistens gibts dann ein "pow(double, int)", das dann bei ordentlich optimierung im endeffekt zu einem x*x wird.

    Meine Kritik ist, dass die Funktion nicht komplett auf meinen Bildschirm passt. Sie ist also zu lang.



  • Welche Funktion???



  • Th schrieb:

    Welche Funktion???

    Die main Funktion, ist doch etwas arg lang das ganze.

    Greetz



  • @Cstoll: Vielen Dank! Näherungsverfahren soll ich benutzen, da es eine Aufgabenstellung unseres Lehrers ist und da wird eben nur das Verfahren verlangt.

    @megaweber: Sollte ich für pow eine Funktion extra schreiben? Ich hab da keine Ahnung, also bitte um Aufklärung.

    @Helium: Ich hab ja geschrieben, dass ich es noch optimieren muss, also zusammenfassen und andere Dinge. Zudem muss ich sagen, dass ich erst ein 3/4 Jahr C++ mache und das nicht alles so top aussieht liegt daran, weil ich es nicht besser weiß.



  • hi Wolframm,

    y=a*pow(x,3)+b*pow(x,2)+c*x+d;
    

    schreibt man seit Horner/Newton's Zeiten besser so:

    y = ((a*x+b)*x+c)*x+d;
    

    vg von Ney


  • Mod

    Ich versteh hier nur Bahnhof.

    Was ist ein a,b,c,d,e etc.?

    Wie schafft man es, eine so lange Funktion zu schreiben? Das ist keine Frage von Optimierung. Einen Lehrer kannst du damit vielleicht beeindrucken - mir wird bei sowas eher übel. Sieht wie ein Spaghettiprogramm ohne goto aus.

    Am besten fängst du nochmal von vorne an und versuchst dabei, die Länge jeder Funktion auf maximal 10 Zeilen zu begrenzen.



  • camper schrieb:

    ...und versuchst dabei, die Länge jeder Funktion auf maximal 10 Zeilen zu begrenzen.

    ... ud jetzt wird mir schlecht!



  • max40 schrieb:

    camper schrieb:

    ...und versuchst dabei, die Länge jeder Funktion auf maximal 10 Zeilen zu begrenzen.

    ... ud jetzt wird mir schlecht!

    *plonk*



  • @nexperty: Danke, das macht es auf jedenfall übersichtlicher.

    @camper: Ich weiß nicht ob du ansatzweise gelesen hast, was ich geschrieben habe. Das sollte man aber tun, um zu wissen warum hier dieses Thema offen ist.
    1.Beitrag

    Ich bin eigentlich fertig mit dem Programm, es muss nur noch optimiert werden.

    2.Beitrag

    @Helium: Ich hab ja geschrieben, dass ich es noch optimieren muss, also zusammenfassen und andere Dinge. Zudem muss ich sagen, dass ich erst ein 3/4 Jahr C++ mache und das nicht alles so top aussieht liegt daran, weil ich es nicht besser weiß.

    Ich will dich eigentlich nicht gleich so anfahren, aber so etwas zu schreiben, obwohl ich es schon 2 mal geschrieben habe, das ich es noch machen muss, finde ich, um es einfach ausdrücken, nur dumm.

    x=-500;
        do
        { y=a*pow(x,3)+b*pow(x,2)+c*x+d;
          //y=-pow(x,3)+x-3;
          if(y<=0)
          { f[0]=x;
            f[1]=x-1;
          }
          x=x+1;
        }while(y>=0);
    
        e=1000;
        do
        { xh=(f[0]+f[1])/2;
          y=a*pow(xh,3)+b*pow(xh,2)+c*xh+d;;
          //y=-pow(xh,3)+xh-3;
          if(y<=0)
          { f[0]=xh;
          }
          else
          { f[1]=xh;
          }
          e=e-1;
        }while(e!=0);
        g[0]=xh;
    

    Das war die ursprüngliche Form des Programms. Ich hatte aber vergessen, dass eine kubische Funktion auch mehr als nur eine Nullstelle hat. Die anderen Teile sind nur kopiert wurden und jeweils so umgeformt wurden das es klappt. Eigentlich ist das Programm eine Schulaufgabe und wir haben 8 Stunden dafür Zeit, aber ich hatte einfach mal Lust, jetzt in den Ferien, dass mal schnell zu schreiben, hat ja nur ein Tag gedauert. So camper, dann sag mir jetzt bitte wie ich das Programm noch besser machen kann, wäre schön wenn du gleich ein Lösungsvorschlag bringst.

    Edit: Außerdem geht das Programm von vielen Faktoren aus, da merkt man meine Unwissenheit im Programmieren noch, z.B.: es darf keine Nullstelle unter -500 geben und ich glaub das Programm benötigt durch die vielen Überprüfungen eine menge Rechenleistung oder kann man es nicht weniger rechenlastig schreiben?


Anmelden zum Antworten