wodka_cheery
10.12.2007, 19:14
Hallo,
habe ein Problem mit meinem C-Code. Das Programm das ich geschrieben habe berechnet mir nicht die richtigen Nullstellen aus und ich weiss jetzt nicht wo das Problem liegen könnte.
z. B.: für bei den Eingaben:
- Auswahl der Funktion: 5
- Intervallgrenze a: 0
- Intervallgrenze b: 2
- Genauigkeit: 0.001
erscheint als Ausgabe folgendes:
- Ergebnis d. ausgwaehten Funktion ist: 1.#QNAN0
- f(x0)=-2.000000
- Interationsschritte: 2293580
Würd mich freuen, falls mir mal jemand da helfen könnte.
Gruß
wodka_cheery
Hier mal den Code:
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
// TA a)
int fn; //globale Variable
double f(double x) //Funktion f mit reellen Parameter x
{
double ergebnis;
switch (fn)
{
case 1: ergebnis = sin(x);
break;
case 2: ergebnis = ((double)exp(x))-(5*x)+1;
break;
case 3: ergebnis = (x*x)-2;
break;
case 4: ergebnis = (1/7)+(1/x);
break;
case 5: ergebnis = (2*x)-2;
break;
default: printf("Fehler bei der Eingabe.\n");
break;
}
return ergebnis;
}
// TA b)
double nullstelle(double a, double b, double g)
{
//Rueckgabeparameter
int anzit=0; //anzit steht für die Ausgabe der Iterationschritte
int ok=1; //Variable für Wahrheitswerte true and false
double x0; //später zur Berechnung von f(x0) falls ok = 1 ist
double c=0;
double ergebnis;
do
{
c=(a+b)/2;
if((f(a)<0 && f(b)>0) || (f(a)>0 && f(b)<0))
{
if(f(c)>0)
{
//a=a;
c=b;
}
if(f(c)<0)
{
//b=b;
c=a;
}
if(f(a)==0)
{
c=b=a; //x0=a
ok==1;
}
if(f(b)==0)
{
c=a=b; //x0=b
ok==1;
}
}
}
while(((f(a)-f(b))>(g)) && (ok!=1));
anzit++;
x0=c;
}
// TA c)
int main (void)
{
double x0, x;
double a, b, g;
int anzit; //Anzahl der Iterationsschritte
printf("Zur Auswahl einer Funktion f, geben Sie bitte eine Zahl zwischen 1 und 5 ein.\n");
scanf("%d", &fn);
printf("Geben Sie die Intervallgrenze a ein: ");
scanf("%lf", &a);
printf("Geben Sie die Intervallgrenze b ein: ");
scanf("%lf", &b);
printf("Geben Sie die Genauigkeit an: ");
scanf("%lf", &g);
// Ergebnis:
x=nullstelle(a, b, g); //Funktionsaufruf
printf("Ergebnis der ausgewaehlten Funktion ist: %lf\n", f(x));
printf("f(x0) = %lf\n", f(x0));
printf("Anzahl der Iterationsschritte: %d\n", &anzit);
system ("pause");
return 0;
}
habe ein Problem mit meinem C-Code. Das Programm das ich geschrieben habe berechnet mir nicht die richtigen Nullstellen aus und ich weiss jetzt nicht wo das Problem liegen könnte.
z. B.: für bei den Eingaben:
- Auswahl der Funktion: 5
- Intervallgrenze a: 0
- Intervallgrenze b: 2
- Genauigkeit: 0.001
erscheint als Ausgabe folgendes:
- Ergebnis d. ausgwaehten Funktion ist: 1.#QNAN0
- f(x0)=-2.000000
- Interationsschritte: 2293580
Würd mich freuen, falls mir mal jemand da helfen könnte.
Gruß
wodka_cheery
Hier mal den Code:
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
// TA a)
int fn; //globale Variable
double f(double x) //Funktion f mit reellen Parameter x
{
double ergebnis;
switch (fn)
{
case 1: ergebnis = sin(x);
break;
case 2: ergebnis = ((double)exp(x))-(5*x)+1;
break;
case 3: ergebnis = (x*x)-2;
break;
case 4: ergebnis = (1/7)+(1/x);
break;
case 5: ergebnis = (2*x)-2;
break;
default: printf("Fehler bei der Eingabe.\n");
break;
}
return ergebnis;
}
// TA b)
double nullstelle(double a, double b, double g)
{
//Rueckgabeparameter
int anzit=0; //anzit steht für die Ausgabe der Iterationschritte
int ok=1; //Variable für Wahrheitswerte true and false
double x0; //später zur Berechnung von f(x0) falls ok = 1 ist
double c=0;
double ergebnis;
do
{
c=(a+b)/2;
if((f(a)<0 && f(b)>0) || (f(a)>0 && f(b)<0))
{
if(f(c)>0)
{
//a=a;
c=b;
}
if(f(c)<0)
{
//b=b;
c=a;
}
if(f(a)==0)
{
c=b=a; //x0=a
ok==1;
}
if(f(b)==0)
{
c=a=b; //x0=b
ok==1;
}
}
}
while(((f(a)-f(b))>(g)) && (ok!=1));
anzit++;
x0=c;
}
// TA c)
int main (void)
{
double x0, x;
double a, b, g;
int anzit; //Anzahl der Iterationsschritte
printf("Zur Auswahl einer Funktion f, geben Sie bitte eine Zahl zwischen 1 und 5 ein.\n");
scanf("%d", &fn);
printf("Geben Sie die Intervallgrenze a ein: ");
scanf("%lf", &a);
printf("Geben Sie die Intervallgrenze b ein: ");
scanf("%lf", &b);
printf("Geben Sie die Genauigkeit an: ");
scanf("%lf", &g);
// Ergebnis:
x=nullstelle(a, b, g); //Funktionsaufruf
printf("Ergebnis der ausgewaehlten Funktion ist: %lf\n", f(x));
printf("f(x0) = %lf\n", f(x0));
printf("Anzahl der Iterationsschritte: %d\n", &anzit);
system ("pause");
return 0;
}