ArchivVorführaufgaben06

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");
}