TiTan91 | voial le code de mon troisieme.c
le pb c que la variable yIm1 (parmis d autres) prend pour valeur l un des exemple ci dessus
yIm1=zIm1 et zIm1 est defini vers la fin de ce code
Code :
- #include <math.h>
- #include "deuxieme.h"
- #define epsilon 1e-6
- #define Pi 3.14159265
- static int cas0, cas1, cas2;
- static double zDbl, zRe, zRe1, zRe2, zIm1, zIm2, yDbl, yRe, yRe1, yRe2, yIm1, yIm2;
- // fonction pour l equation en y
- int troisieme1(double b3, double b2, double b1, double b0)
- {
- cas0=troisieme2( b1/b3 - (b2*b2)/(3*b3*b3) , b0/b3 + 2*pow(b2/(3*b3),3) - (b2*b1)/(3*b3*b3) );
- if (cas0==24)
- {
- yRe = zRe - b2/(3*b3);
- yRe1 = zRe1 - b2/(3*b3);
- yIm1 = zIm1;
- yRe2 = zRe2 - b2/(3*b3);
- yIm2 = zIm2;
- if (fabs(yRe1) < epsilon && fabs(yRe2) < epsilon)
- {
- return 16;
- }
- else
- {
- return 24;
- }
- }
- if (cas0==16)
- {
- yRe = zRe - b2/(3*b3);
- yRe1 = -b2/(3*b3);
- yIm1 = zIm1;
- yRe2 = -b2/(3*b3);
- yIm2 = zIm2;
- if (fabs(yRe1) < epsilon && fabs(yRe2) < epsilon)
- {
- return 16;
- }
- else
- {
- return 24;
- }
- }
- if (cas0==9)
- {
- yRe = zRe - b2/(3*b3);
- yDbl = zDbl - b2/(3*b3);
- return 9;
- }
- if (cas0==8)
- {
- yRe = zRe - b2/(3*b3);
- yRe1 = zRe1 - b2/(3*b3);
- yRe2 = zRe2 - b2/(3*b3);
- return 8;
- }
- return -1;
- }
- // fonction pour l equation en z
- int troisieme2(double p, double q)
- {
- // definition du cas a appliquer grace a la fonction du second degre
- if (p>=0)
- {
- cas1=deuxieme(1, q, -pow(p/3, 3));
- }
- else
- {
- cas1=deuxieme(1, q, pow(-p/3, 3));
- }
- if (cas1==2) // 1er cas : 1 racine reelle et 2 racines complexes
- {
- if (getRe1()>=0 && getRe2()>=0)
- {
- zRe = pow(getRe1(), 1./3.) + pow(getRe2(), 1./3.);
- }
- else if (getRe1()>=0 && getRe2()<0)
- {
- zRe = pow(getRe1(), 1./3.) - pow(-getRe2(), 1./3.);
- }
- else if (getRe1()<0 && getRe2()>=0)
- {
- zRe = -pow(-getRe1(), 1./3.) + pow(getRe2(), 1./3.);
- }
- else
- {
- zRe = -pow(-getRe1(), 1./3.) - pow(-getRe2(), 1./3.);
- }
- cas2=deuxieme(1, zRe, p+zRe*zRe);
- if (cas2==6)
- {
- zRe1=getRe1();
- zIm1=getIm1();
- zRe2=getRe2();
- zIm2=getIm2();
- return 24;
- }
- else if (cas2==4)
- {
- zIm1=getIm1();
- zIm2=getIm2();
- return 16;
- }
- else
- {
- return -1;
- }
- }
- else if (cas1==3) // 2eme cas : 1 racine reelle et 1 racine double
- {
- if (q>=0)
- {
- zDbl = pow(q/2, 1./3.);
- zRe = -2*pow(q/2, 1./3.);
- }
- else
- {
- zDbl = -pow(-q/2, 1./3.);
- zRe = 2*pow(-q/2, 1./3.);
- }
- return 9;
- }
- else if (cas1==6) // 3eme cas : 3 racines reelles
- {
- zRe = 2 * sqrt(-p/3)
- * cos(atan(fabs(getIm1())/getRe1())/3);
- zRe1 = 2 * sqrt(-p/3)
- * cos((atan(fabs(getIm1())/getRe1())+2*Pi)/3);
- zRe2 = 2 * sqrt(-p/3)
- * cos((atan(fabs(getIm1())/getRe1())+4*Pi)/3);
- return 8;
- }
- else if (cas1==4) // 3eme cas (avec partie reelle nulle pour la solution du 2e degre) : 3 racines reelles
- {
- zRe = 2 * sqrt(-p/3) * cos(Pi/6);
- zRe1 = 2 * sqrt(-p/3) * cos(Pi/6 + 2*Pi/3);
- zRe2 = 2 * sqrt(-p/3) * cos(Pi/6 + 4*Pi/3);
- return 8;
- }
- else
- {
- return -1;
- }
- }
- // fonctions de retour des solutions
- double getyDbl()
- {
- return yDbl;
- }
- double getyRe()
- {
- return yRe;
- }
- double getyRe1()
- {
- return yRe1;
- }
- double getyRe2()
- {
- return yRe2;
- }
- double getyIm1()
- {
- return yIm1;
- }
- double getyIm2()
- {
- return yIm2;
- }
|
Message édité par TiTan91 le 30-01-2003 à 21:16:59
|