#include #include #include #include #include int fn; //Funktionsnummer GLOBAL double f(double,int); int nullstelle(double a,double b,double g,int *ok,double *x0,int fn); int main(void) { //Definitionen char *eingabe; double x; //Funktionswert double a,b; //Intervallgrenzen double g; //Genauigkeit int anzit,ok; // Übergabe der Interationen aus Funktion nullstelle double x0; //Rückgabewert //Deklarationen x=0; fn=0; a=b=0; g=0; //Main printf("Aufgabe 4: Nullstellensuche\n"); printf("Bitte die gewuenschte Funktion auswaehlen:\n"); printf(" 1) sin(x)\n"); printf(" 2) e^x-5x+1\n"); printf(" 3) x^2-2\n"); printf(" 4) 1/7+1/x\n"); printf(" 5) 2x-2\n\n"); printf("Bitte waehlen:"); scanf("%d",&fn); //einlesen der funktionsnummer if ((fn<1)||(fn>5)){printf("Ungueltige Fkt., Standard gewaehlt.\n");fn=1;} // Falls keine Gültige eingabe FN 1 gewählt fflush(stdin); printf("\n\nFunktion erfolgreich gewaehlt...\n\n"); printf("Intervallsgrenzen waehlen:\n"); printf(" untere Grenze a: "); scanf("%lf",&a); printf("\n obere Grenze b: "); scanf("%lf",&b); printf("\n absolute Genauigkeit g: "); scanf("%lf",&g); if ((g<=0)){printf("Ungueltiger oder unsinniger Wert, Standard gewaehlt.\n");g=0.1;} fflush(stdin); printf("\n\nSie haben a:%lf, b:%lf, g:%lf gewaehlt.\n\n",a,b,g); anzit=nullstelle(a,b,g,&ok,&x0,fn); // Aufruf der funktion Nullstelle mit Werten von a b g und adressen von ok x0 fn if (ok==1) { printf("Berechnung erfolgreich, Nullstelle bei x=%.10lf\n",x0); printf("Anzahl der benoetigten Iterationsschritte: %d\n\n",anzit); printf("Zur Kontrolle: f(x0)=%.10lf",f(x0,fn)); } else { printf("Berechnung nicht erfolgreich, keine Nullstelle\n"); printf("Wird beendet...\n\n"); } getch(); return 0; } double f(double x,int fn) //Funktion zur auswahl der Rechenfunktion mittles übergebenene Wertes fn { 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: if (x=0); return 1/7+1/x; break; case 5: return 2*x-2; break; default: printf("Ungueltige Funktion!\n\n"); break; } } int nullstelle(double a, double b, double g, int *ok, double *x0, int fn) // Funktion Nullstelle einlesen der parameter a,b Genauigkeit g etc. { double mittel; double unten, oben; int iterationen; double temp; temp=0; unten=a; oben=b; iterationen=0; while ((oben-unten)>g) //Solange oben - unten grosser genauigkeit mache --> { iterationen++; // Erhöhung interationen mittel=(unten+oben)/2; // Mittel ausrechnen oben und unten durch 2 printf("Untere Grenze: %3.5lf Mittelwert: %3.5lf Obere Grenze: %3.5lf",unten,mittel,oben); if (f(unten,fn)*f(mittel,fn)<0) // Formel zum berechnen der Nullstelle { printf(" (*)\n"); oben=mittel; } else if ((f(unten,fn)*f(mittel,fn)==0)) {//printf("Nullstelle gefunden"); break; } else { printf("\n"); unten=mittel; } } if ((f(unten,fn)*f(oben,fn))<0) { *ok=1; //Übergabe der 1 an die Adresse des Pointers //ohne Interpolation:*x0=mittel; //mit Interpolation: mittel=(unten+oben)/2; //Berechnung ohne Interpolation printf("\nohne Interpolation: %.10lf, Abweichung %.10lf\n",mittel,f(mittel,fn)); // a - f (a) * ( b - a / f (b) - f(a)) // Interpolations Formel temp=unten-f(unten,fn)*(oben-unten)/(f(oben,fn)-f(unten,fn)); // Berechnung mit Interpolation *x0=temp; // Übergabe des Wertes temp an die adresse des Pointer printf("mit Interpolation: %.10lf, Abweichung %.10lf\n\n",temp,f(temp,fn)); return iterationen; } else { *ok=0; *x0=0; return iterationen; } system("PAUSE"); } // NULLSTELLEN PRUEFEN