Berechnung von Nullstellen mit dem Newton Verfahren
-
Sooo....
also wir haben das Programm von unserem Lehrer bekommen und sollten es so abändern das man Funktionen 5. Grades selber eingeben kann das hab ich hoffentlich auch erfolgreich gelöst allerdings interessiert es mich wie ich das Programm abändern muss damit man auch selber festlegen kann wievielten Grades die Funktion sein soll.Ich hab Angefangen was mit Arrays zu schreiben hab das dann aber Abgebrochen weil ich dann nicht mehr weiß wie ich die Funktionen und die Ableitungsfunktion aufstelle.
Würd mich über hilfe freuen
Hier mal mein Quelltext:
#include <iostream.h> #include <math.h> #include <iomanip.h> #include <conio.h> float // Variablen für die Funktion f5, f4, f3, f2, f1, f0, // Variabeln für Newton Verfahren xo, xn, xn1, fxn, f1xn, epsilon; float funktion (float); float ableitungsfunktion (float); void main() { cout<<"Newton-Verfahren zur Nullstellenbestimmung für Funktion 5. Grades\n\n"; //--- Funktion eingeben --- cout<<"Bitte geben Sie die Funktion ein:\n"; cout<<"Allgemeine Form: f(x)= a5x^5 + a4x^4 + a3x^3 + a2x^2 + a1x + a0\n"; cout<<"\nBitte geben sie a5 ein:"; cin>>f5; cout<<"Bitte geben sie a4 ein:"; cin>>f4; cout<<"Bitte geben sie a3 ein:"; cin>>f3; cout<<"Bitte geben sie a2 ein:"; cin>>f2; cout<<"Bitte geben sie a1 ein:"; cin>>f1; cout<<"Bitte geben sie a0 ein:"; cin>>f0; cout<<"\nDie Ableitungsfunktion wurde automatisch berechnet.\n\n"; startwert: //---- Startwert eingeben --- cout<<"Bitte geben Sie den Startwert ein:"; cin>>xo; cout<<"\n"; // epsilon legt fest wie genau die Nullstelle berechnet werde soll epsilon=0.001; xn1=xo; while (abs(xn1-xn) > epsilon) { xn=xn1; fxn=funktion(xn); f1xn=ableitungsfunktion(xn); xn1=xn-(fxn/f1xn); cout<<setw(10)<<"xn1="<<xn1<<"\n"; } cout<<"\nNullstelle="<<xn1; cout<<"\n"; getch(); cout<<"\n"; goto startwert; } float funktion (float x) { float y=f5*(x*x*x*x*x)+f4*(x*x*x*x)+f3*(x*x*x)+f2*(x*x)+f1*x+f0; return (y); } float ableitungsfunktion (float x) { float y=5*f5*(x*x*x*x)+4*f4*(x*x*x)+3*f3*(x*x)+2*f2*x+f1; return (y); }
Benutze übrigens den Borland C++ Builder 3 zum Programmieren.
-
hi.
Sehe hier kein mathematisches Problem. Gehört eher nach C++, aber gut.
Die Funktion kann man gut mit dem Hornerschema in einer Schleife berechnen:float funktion (float *koeff, unsigned n, float x) { float y=koeff[n]; //Hornerschema: f3*(x*x*x)+f2*(x*x)+f1*x+f0==f0 + x(f1 + x(f2 + x(f3))) for(unsigned i=n-1; i>=0; --i){ y*=x; y+=koeff[i]; } return y; } int main() { cout<<"Newton-Verfahren zur Nullstellenbestimmung für Funktion 5. Grades\n\n"; unsigned n; cout << "Grad der Funktion: "; cin >> n; float *koeff=new float[n+1]; cout<<"\nBitte geben Sie die Funktion ein:\n"; cout<<"Allgemeine Form: f(x)= anx^n + a(n-1)x^(n-1) + ... + a1x + a0 \n"; //wenn du lustig bist machst du hier auch eine schleife. for(unsigned i=0; i<=n; ++i) { cout<<"\nBitte geben sie a" << i << " ein: "; cin>>koeff[i]; } cout<<"Bitte geben Sie den Startwert ein:"; //... funktion(koeff, n, x0); //... delete [] koeff; return y; }
-
sorry dachte weil das unsere Mathe Hausaufgabe war post ich es auch in dem Bereich
-
Sorry ich bin nicht so die C++ Leuchte könntest du mir das näher erläutern wie ich den Quelltext zum laufen bringe?
Und kannst du mir folgende Teile erklären?
float funktion (float *koeff, unsigned n, float x) { float y=koeff[n]; //Hornerschema: f3*(x*x*x)+f2*(x*x)+f1*x+f0==f0 + x(f1 + x(f2 + x(f3))) for(unsigned i=n-1; i>=0; --i){ y*=x; y+=koeff[i]; } return y; }
Was macht dieser Teil des Programmes:
y*=x;
y+=koeff[i];float *koeff=new float[n+1];
Wird hier die Variable *koeff mit einem neuen Wert überschrieben.
//... funktion(koeff, n, x0); //... delete [] koeff; return y;
Was macht der Teil hier?
Danke für die Hilfe
-
infester schrieb:
Sorry ich bin nicht so die C++ Leuchte könntest du mir das näher erläutern wie ich den Quelltext zum laufen bringe?
Und kannst du mir folgende Teile erklären?
float funktion (float *koeff, unsigned n, float x) { float y=koeff[n]; //Hornerschema: f3*(x*x*x)+f2*(x*x)+f1*x+f0==f0 + x(f1 + x(f2 + x(f3))) for(unsigned i=n-1; i>=0; --i){ y*=x; y+=koeff[i]; } return y; }
Was macht dieser Teil des Programmes:
y*=x;
y+=koeff[i];float *koeff=new float[n+1];
Wird hier die Variable *koeff mit einem neuen Wert überschrieben.
//... funktion(koeff, n, x0); //... delete [] koeff; return y;
Was macht der Teil hier?
Danke für die Hilfe
Also ich bin auch nicht so der c++ guru,aber ich werde versuchen dir bis sich,
ein paar qualifiziertere c++ junks sich zu wort melden dir etwas helfen.
zu deiner ersten frage:
so wie es aussieht wird ein neues eindimensionales array vom typ float in die adresse koeff angelegt.die größe des arrays beträgt n+1 also ich hoffe das muß ich dir nicht erklären:-)
zur 2. frage:
der wert der variable x wird in die pointer var. geschrieben und
y+=koeff[i] bedeutet das der alte wert von y ersetzt wird mit dem wert des arrays[i] also y=y+koeff[i] sagt dir vielleicht mehr...