VII.2 - Méthode De Bernoulli
Objectif : Recherche d'une racine d'un
polynôme
Cette méthode est utilisée pour trouver une
racine d'un polynôme
Pn.(x) = aoxn +
aixn + · · · + an
Qui sera transformé en une équation
récurrente aoy(m + n) + aiy(m + n --
1) + · · · + any(m)
Elle est basée sur le principe suivant : on donne les
valeurs suivantes y(0), y(1),..., y (n-1) (solution particulière) et on
va calculer y(n), y (n+1),...
--1
a (aiy(m + n -- 1) + · · ·
+ any(m))
o
aoy(m + n) =
On a lorsque m?8, l'expression y (m+1)/y(m) tends vers la
racine du polynôme
Le programme
//TP13 Calcul Numerique //Methode de Bernoulli
#include<iostream.h> #include<conio.h>
#include<alloc.h> #include<math.h>
int bernoulli(double *pol,double *sol,int dgr,double &r,int
Kmax=10,double eps=0.3) {double tmp=0;
double *p=(double*)malloc((dgr+1)*sizeof(double));
//on sauvegarde pol inverse dans p pour utiliser p dans la fct
poly(math.h) for(int t=0;t<=dgr;t++) p[t]=pol[dgr-t];
//on divise les coef par le 1er coef*-1
//afin de construire la suite
for(t=1;t<=dgr;t++) pol[t]*=-(1.0/pol[0]);
//sol[i+1]/sol[i] tend vers la racine
for(t=0;t<dgr;t++)
{if(!sol[t]) continue;
tmp=sol[t+1]/sol[t];
tmp=poly(tmp,dgr,p);
if(fabs(tmp)<eps) {r=sol[t+1 ]/sol[t] ;free(p);return 1; }
}
//calcul des elements de la suite
for(int k=0;k<Kmax;k++)
{tmp=0;
for(int i=1 ;i<=dgr;i++)
tmp+=pol[i] *sol[i- 1];
sol[dgr]=tmp;
tmp=sol[dgr]/sol[dgr- 1];
tmp=poly(tmp,dgr,p);
if(fabs(tmp)<eps) {r=sol[dgr]/sol[dgr- 1] ;free(p);return 1;
}
else
for(i=0;i<dgr;i++)
sol[i]=sol[i+1 ];
}
cout<<"pas de convergence vers la solution";
free(p);
return 0;
}
void main()
{cout<<"Entrer le degre du polynome n :";
int dgr;cin>>dgr;//degre du poly
cout<<"Entrer les coefficient a partir du plus haut
degre\n";
double *pol=(double*)malloc((dgr+1 )*sizeof(double));
//lecture des coef
for(int i=0;i<=dgr;i++)
{ cout<<"a"<<i<<"=";
cin>>pol[i];
}
double * SolPart=(double*)malloc((dgr+1 )*sizeof(double));
cout<<"Entrer la solution particuliere\n";
//lecture de la solution particuliere
for(i=0;i<dgr;i++)
{ cout<<"s"<<i<<"=";
cin>>SolPart[i];
}
double racine;
if(bernoulli(pol,SolPart,dgr,racine)) cout<<"racine
approchee ="<<racine; free(pol);free(SolPart);//liberation memoire
getch();
}
|