Programmation en C équation du 3 ième degré

Fermé
flopiflop Messages postés 2 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 6 mai 2009 - 5 mai 2009 à 15:54
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 - 6 mai 2009 à 16:12
Bonjour,

j'ai réaliser un programme en C qui effectue la résolution d'une équation du troisième degré.

la méthode est la suivante: je crée mes fonctions dans le .C
je crée les proptotype dans header.H
j'execute mes fonctions dans le main.C

apparement c'est un méthode de programmation plus professionnelle

le problème qui se pose c'est que j'ai une valeur pour Xn >>> (très grande)!!!!!

et que la méthode de newton ne fonctionne pas correctement!!!!

quelqu'un peut il m'aider à trouver l'erreur voiçi le code:

/***Fonction.C***/

#include<e:\info\p2x.h>
#include<e:\info\p2x.c>
#include<e:\info\p3x.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

void resolution_P3(double *p_tab)
{

double a,b,r,R,xd,pre=1e-5,x_newton;
double tab[4],tbl[3];

if(p_tab[0]==0)
{
resolution(p_tab+1);
}
else
{
if(p_tab[3]==0)
{

printf("\r\n\n x=0 celle ci est une racine evidente");
resolution(p_tab);
}
else
{
a = max_coeff (tab+1); /*calcul de R selon a*/
R = 1+(a/(fabs(p_tab[0])));

b = max_coeff (tab);/*calcul de r selon b*/
r = 1/1+(b/(fabs(p_tab[3])));

xd = (r+R)/2;
printf("\r\n xd = %lf", xd);
getch();

x_newton = Newton(p_tab,pre,xd);

if(x_newton==0) x_newton = Newton(tab,pre,-xd);

if(x_newton==0) printf("\n\n\n\r il n'y a pas de convergence par
Newton");



else
{
printf("\n\n\n\r il y a une racine r‚elle = %4.4lf ",x_newton);

horner(tab,tbl,x_newton,3);
resolution(p_tab);
}


}
}


void saisie(double *p_tab_coeff)
{
printf("\r\n\n Veuillez introduire les coefficients d'une ‚quation du troisiŠme degr‚");
printf("\r\n\t sous la forme: AXü + BXý + CX + D = 0");
printf("\r\n\n\t\t valeur de A = ");
scanf("%lf",p_tab_coeff);
printf("\r\n\t\t valeur de B = ");
scanf("%lf",p_tab_coeff+1);
printf("\r\n\t\t valeur de C = ");
scanf("%lf",p_tab_coeff+2);
printf("\r\n\t\t valeur de D = ");
scanf("%lf",p_tab_coeff+3);
}
void edition_p3x(double *p_tab_coeff)
{
printf("\r\n\n Y = %lf Xü + %lf Xý + %lf X + %lf ", p_tab_coeff[0],p_tab_coeff[1],p_tab_coeff[2],p_tab_coeff[3]);
}
double max_coeff(double *p_tab_coeff)
{
int n;
double max;

n=1;

max = fabs(p_tab_coeff[0]);
do
{
if(fabs(max) < fabs(p_tab_coeff[n])) max = fabs(p_tab_coeff[n]);
n++;
}
while(n<3);

return max;


}
void horner(double *p_tab, double *p_tbl, double xn, int i)
{
int j;
p_tbl[0]=p_tab[0];

for(j=1;j<i;j++)
{
p_tbl[j]=p_tab[j]+(p_tbl[(j-1)]*xn);
}
}

double Newton(double *p_tab_coeff, double xn, double pre)
{
int nbr = 0;
double tab_coeff_b[4];
double tab_coeff_c[3];
double val_new=0;


do
{
horner(p_tab_coeff,tab_coeff_b,xn,3);
horner(p_tab_coeff,tab_coeff_c,xn,2);

xn = xn-(tab_coeff_b[3]/tab_coeff_c[2]);
printf("\n\r xn = %lf", xn);
getch();
nbr++;
}
while(fabs(tab_coeff_b[3]) > pre && nbr<20);

printf("\n\n\n\r nbr = %d les calculs ont ‚t‚ effectu‚s par la m‚thode de Newton ",nbr);

if(nbr<20)
{
val_new=xn;
}

return val_new;










/***Main.C***/

#include<e:\info\p3x.h>
#include<e:\info\p3x.c>
#include<stdio.h>
#include<conio.h>

void main (void)
{
double tab_coeff[4];
clrscr();
saisie(tab_coeff);
edition_p3x(tab_coeff);
resolution_P3(tab_coeff);
getch();
}


/***Header.H***/

#ifndef p3x.h
#define p3x.h

void resolution_P3(double*);
void saisie(double *);
void edition_p3x(double *);
double max_coeff(double*);
void horner(double*, double*, double, int);
double Newton(double*, double, double);

#endif


PS: la fonction du deuxième degré fonctionne correctement!!!

merci.
A voir également:

2 réponses

pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
5 mai 2009 à 16:00
Bon, je n'ai pas lu le code, mais une variable avec une valeur très grande laisse présagé un défaut d'initialisation, commence par là...
0
flopiflop Messages postés 2 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 6 mai 2009
6 mai 2009 à 16:05
slt,

mais quel variable???? que je dois réinitialiser????
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
6 mai 2009 à 16:12
Xn ou une des variables utilisées pour le calcul...
0