Numerische Nullstellenberechnung - C-Programme

Neue Frage »

lala98765 Auf diesen Beitrag antworten »
Numerische Nullstellenberechnung - C-Programme
Meine Frage:
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
chrizke Auf diesen Beitrag antworten »

Bevor ich mir jetzt den ganzen Code anschaue: Was ist denn dein Problem? Was funktioniert nicht?
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.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »