Nullstellen-Suche
Vorführaufgabe 06 · C
- Datei: vorfuehraufgabe06.c
- Stand:
- Umfang: 114 Zeilen
#include <stdio.h>
#include <math.h>
int fn;
double f(double x)
{
if(fn<=5 && fn>=1)
{
switch(fn)
{
case 1:{
return sin(x);
break;
}
case 2:{
return exp(x)-5*x+1;
break;
}
case 3:{
return x*x-2;
break;
}
case 4:{
return (double)1/7+1/x;
break;
}
case 5:{
return 2*x-2;
}
}
}
return 0;
}
struct rueckgabe
{
int anzit;
int ok;
double x0;
};
struct rueckgabe nullstelle(double a,double b,double g)
{
struct rueckgabe merker;
double c=0;
merker.anzit=0;
merker.ok=1;
do{
c=(a+b)/2;
if (f(a)>0 && f(b)<0)
{
if(f(c)>0)
{
a=c;
}
else
{
b=c;
}
}else if(f(a)<0 && f(b)>0)
{
if(f(c)<0)
{
a=c;
}
else
{
b=c;
}
}else if(f(a)==0)
{
c=b=a; // x0=a
}
else if(f(b)==0)
{
c=a=b; // x0=b
}
else merker.ok=0;
merker.anzit++;
}while (g<fabs(f(a)-f(b)) && merker.ok!=0);
merker.x0=c;//oder mit linearer Interpolation: a-f(a)*(b-a)/(f(b)-f(a));
return merker;
}
void main(void)
{
double a,b,g;
struct rueckgabe merker;
printf("Waehlen Sie eine Funktion (1-5): ");
scanf("%d",&fn);
printf("\nUntere Intervallgrenze a = ");
scanf("%lf",&a);
printf("Obere Intervallgrenze b = ");
scanf("%lf",&b);
printf("Die absolute Genauigkeit g = ");
scanf("%lf",&g);
merker=nullstelle(a,b,g);
if(merker.ok!=0)
printf("\nErgebnis E = %.10lf\nAnzahl der Iterationen I = %d\nFunktionswert fuer x0 F = %.10lf\n\n",merker.x0,merker.anzit,f(merker.x0));
else
printf("\nKein Vorzeichenwechsel an den Intervallgrenzen!\n\n");
}