Numerische Nullstellenberechnung - C-Programme |
15.05.2013, 16:13 | lala98765 | Auf diesen Beitrag antworten » |
Numerische Nullstellenberechnung - C-Programme ich soll Programme fur die Gleichung 2x+ln(2x+3)=1 schreiben. Bisektionsverfahren, sekantenverfahren, Newton-verfahren und Müller-Verfahren. Habe schon drei angefangen, aber ich weiß nicht was ich falsch gemacht habe. Hoffe, jemand kann mir helfen. // Sekantenverfahren #include <stdlib.h> #include <stdio.h> #include <math.h> // Gleichung: 2x+ln(2x+3)=1 double f(double x) { 2*(x)+log(2*(x)+3)-1; } int main(int argc, char *argv[]); int main(int argc, char *argv[]) { int i=1; double x0=0; double x1=1; double fx0,fx1; double x2; double Fehler; printf("\nGeben Sie ein, auf welche Genauigkeit die Nullstelle berechnet werden soll: "); scanf("%f",&Fehler); do { fx0=f(x0); printf("Näherungswert:\n%d",fx0); fx1=f(x1); printf("Näherungswert:\n%d",fx1); x2=x1-((x1-x0)/(fx1-fx0))*fx1; x0=x1; x1=x2; i++; } while(fx1-fx0>Fehler); } ---------------------------------- //Newton-Verfahren #include <stdlib.h> #include <stdio.h> #include <math.h> // Gleichung: 2x+ln(2x+3)=1 double f(double x) { 2*(x)+log(2*(x)+3)-1; } //Ableitung der Funktion double af(double x) { 2/(2*(x)+3)+2; } int main(int argc, char *argv[]); int main(int argc, char *argv[]) { int i=1; double x0=0; //Startwert double x1; //nächster Wert double Fehler; //relativer Fehler double x; //Näherung der Nullstelle double t; //Tangente double u; //Tangente - Wert*x printf("\nGeben Sie ein, auf welche Genauigkeit die Nullstelle berechnet werden soll: "); scanf("%f",&Fehler); do { t=af(x0)*x+f(x0)-af(x0)*x0; //Tangentengleichung u=t-af(xo)*x; //nach x auflösen x=u/af(x0); printf("Näherung der Nullstelle: \n%d",x); x1=x0-(f(x0)/af(x0)); //neuen Wert für x0 berechnen x0=x1; i++; } while(Fehler<x); } ---------------------------------- // Bisektionsverfahren #include <stdlib.h> #include <stdio.h> #include <math.h> // Gleichung: 2x+ln(2x+3)=1 double f(double x) { 2*(x)+log(2*(x)+3)-1; } int main(int argc, char *argv[]); int main(int argc, char *argv[]) { int i=1; double a,b; //Intervallgrenzen double p; //Mittelpunkt [a,b] double Fehler; //relativer Fehler double fa,fb,fp; //Funktionswerte printf("\nGeben Sie eine untere Intervallgrenze ein: "); scanf("%f",&a); printf("\nGeben Sie eine obere Intervallgrenze ein: "); scanf("%f",&b); printf("\nGeben Sie ein, auf welche Genauigkeit die Nullstelle berechnet werden soll: "); scanf("%f",&Fehler); do { //Mittelpunk des Intervalls p=a+(b-a)/2; //Funktionswerte fa= f(a); fb= f(b); fp= f(p); //Intervallhalbierung if(fa*fp<0) { b=p; } else { a=p; } i++; } while(fp>Fehler); printf("Die Näherung der Nullstelle ist: \n%d",p); } Meine Ideen: Danke schonmal |
||
16.05.2013, 17:45 | chrizke | Auf diesen Beitrag antworten » |
Bevor ich mir jetzt den ganzen Code anschaue: Was ist denn dein Problem? Was funktioniert nicht? |
||
17.05.2013, 01:12 | RavenOnJ | Auf diesen Beitrag antworten » |
Im Sekantenverfahren dürfte der Fehler im while(...) legen. Dort hätte while(fabs(fx1 - fx0) > Fehler) stehen müssen. Schon im 2. Schleifendurchlauf wird fx1-fx0 < 0 und die Schleife wird beendet. Andere gefährliche Stellen im Code lasse ich mal unberücksichtigt. |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
Die Neuesten » |
|