Recherche de zero d'une fonction...

Résolu
Utilisateur anonyme -  
 pom -
bonjour à tous
débutante en programmation, jai tenté de rédiger un programme permettant de trouver les racines de la fonction f=(1/2) - (x^2) sur l'interval [0,1]. pour cela je veux utiliser la méthode de pas. jai donc tapé ceci :
voici mon nouveau programme ( VERSION MODIFIEE !!! )

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double delta_x = pow ( 10 , (-8) );

double f ( double x )
{
double y;
y = 0.5 - x*x;
return y;
}

double systematique (void)
{
double x;
double f ( double x );
for ( x=0 ; x<=1 ; x = x + delta_x )
{
if ( fabs (f(x))==0 ) return x;
}
}

int main ()
{
double x;
double f(double x);
double systematique ();
double zero;
zero = systematique();
printf ( "%lf est une racine de f", zero );
return 0;
}

Le problème c'est que j'obtient tj le même résultat : 0,000 est une racine de f
or, 0 n'est pas le bonne réponse
quelq'un pourrait-il me dire ou est l'erreur ? j'obtient la même chose en utilisant une fonction epsilon petite et en écrivant : if ( fabs(f(x))<eps)
:-(

3 réponses

bobcarter Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Salut
j'ai pas eu le temps de lire ton programme pour retrouver ton erreur parceque je suis tres oqp en meme tps.
Mais je peux te conseiller, tu peux utiliser la methode de dichotomie pour retrouver le zero de ta fonction.Elle est dejà interessante parceque ta fonction f=(1/2) - (x^2) est positive en a=0 et et negative en b=1. Alors tu peux utiliser la methode de dichotomie parceque la condition f(a)*f(b)<0 est respectée.Donc à chaque iteration tu divisera ton intervalle [a, b] en deux parties et tu gardera que la partie ou la condition f(a)*f(b)<0 est respectée.

Pour etre plus clair tu fais c=(a+b)/2 et tu as tes deux intervalles [a c] et [c b]. tu verifie si f(a)*f(c)<0 alors tu es sure de trouver ton zero dans l'intervalle [a c] dc tu redui ton intervalle en disant b=c. si la condition f(a)*f(c)<0 n'est pas vrai alors le zero de ta fonction se trouve plustot dans l'intervalle [c b] , donc tu fais a=c .
Ainsi tu fais une boucle qui s'arretera quand ton intervalle [a b] sera tres petit. (b-a<precision ); Ta fonction ressemblera à ce qui suit .

#include <stdio.h>
#include <math.h>

double dichotomie (double a, double b, double eps,
double (*f)(double))

{
double e,em,c,fa,fb,fc;

fa=f(a); /* valeurs de la fonction */
fb=f(b);
e=b-a; /* longueur intervalle initial */
em=eps*(fabs(a)+fabs(b));
while (e>em) { /* condition de convergence */
c=(a+b)/2.0; /* milieu intervalle courant */
fc=f(c);
if (fa*fc<0.0) { /* [a,b] --> [a,c] */
b=c; fb=fc;
}
else { /* [a,b] --> [c,b] */
a=c; fa=fc;
}
e=b-a; /* nouvelle longueur */
em=eps*(fabs(a)+fabs(b));
}
return c; /* c est la solution cherchée */
}

Bnne chance
Bobby
0
Utilisateur anonyme
 
merci beaucoup, le pb c ke je ne peux pas utiliser cette méthode dans le devoir qu'on nous a donné :-S
0
bobcarter Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Il n y a pas de koi.
Si g le tps j regarderai unpeu ton programe mais c pas evidement pour moi.
bnne chance
0
pom
 
Salut, plusieurs choses tout d'abord
Je pen se que ton erreur vient de ton main :
int main () 
{ 
double x; <-- par défaut x vaut 0 (sauf erreur de ma part)
double f(double x);  <-- pour appeler f tu dois écrire double d1=f(x)
double systematique (); <-- dans ta fonction systematique x vaut 0, pourquoi ne mets tu pas x en argument de cette fonction ?
double zero; 
zero = systematique(); <-- pourquoi appelles-tu deux fois cette fonction ?
printf ( "%lf est une racine de f", zero ); 
return 0; 
} 
0