Programm welches Nullstelle findet...



  • Hallo,

    also ich muss für die Schule ein Programm schreiben welches die Nullstellen in einer Funktion findet...
    Die Funktion f(x) wird mit 2^x-3 beschrieben.
    ich weis dass diese so eingelsen wird:

    double f = pow(2,x) - 3;
    

    Ich habe dann ein Intervall [a,b]...

    Jetzt soll ich eine C-Funktion (double suche(..);) schreiben: diese Funktion soll das Intervall in 10 Teile teilen und dann so lange nach rechts gehen bis sich das Vorzeichen f(x) ändert..
    Dieser Punkt wird dann die neue Schrittweite, wobei gilt: neue Schrittweite = 1/10 der Alten.
    Dann wieder nach links bis sich das Vorzeichen ändert usw.
    Und das macht man solange bis die Schrittweite < der Genauigkeit ist.

    Ich hoffe irgendjemand versteht das und kann mir weiter helfen...
    Wäre schon wenn ich ein paar Tipps bekämen würde.
    Thx



  • Schon mal die Forensuche bemüht?

    Oben rechts bei Registrieren und Login gibt es ein Suchen.

    Und unter Suchanfrage (nicht Google) gibst du Nullstelle ein.



  • #include <math.h>
    #include <stdio.h>
    #include <stdlib.h> /* Windows -> system("PAUSE") */
    
    double Function(double x){
    	return pow(2.0,x) - 3.0; /* Fuer andere F(x) diese Zeile einfach austauschen */
    }
    
    int TenStepper(double (*F)(double), double a, double b, double delta, double* result){
    	int oldSign, tmpSign;
    	double step = b-a, stepSign = 1.0;
    
    	*result = a;
    	oldSign = F(*result) < 0.0 ? -1 : 1;	
    	while((step *= 0.1) > delta){
    		do{
    			*result += step * stepSign;
    			tmpSign = F(*result) < 0.0 ? -1 : 1;
    			if(*result > b+delta || *result < a-delta)
    				return 0;
    		}while(oldSign == tmpSign);
    		oldSign = tmpSign;
    		stepSign *= -1.0;
    	}
    	return 1;
    }
    
    void ReadDouble(const char* prompt, double* inout){
    	do{
    		printf("%s", prompt);
    		if(scanf("%lg", inout) == 1)
    			return;
    		while(getchar()!='\n');
    	}while(1);		
    }
    
    int main(void){
    	double a,b,delta, result;
    
    	ReadDouble("a = ", &a);
    	ReadDouble("b = ", &b);
    	do{
    		ReadDouble("delta = ", &delta);
    	}while(delta < 0.0);
    	if(!(a < b ? TenStepper(Function, a, b, delta, &result) : TenStepper(Function, b, a, delta, &result)))
    		printf("N/A\n");
    	else
    		printf("%g\n", result);
    	system("PAUSE");
    	return 0;
    }
    /* -- NO COMMENT, NO WARRANTY -- */
    

Anmelden zum Antworten