begin process at 2010 02 10 01:06:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths et Algorithmes

 > EQUATION TROISIEME DEGRÉ CARDAN

EQUATION TROISIEME DEGRÉ CARDAN


 Information sur la source

Note :
Aucune note
Catégorie :Maths et Algorithmes Classé sous :equations, troisieme degré, cardan Niveau :Débutant Date de création :06/06/2008 Date de mise à jour :06/06/2008 17:33:59 Vu :3 521

Auteur : usef01

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

un petit programme pour résoudre les équations de troisième degré selon la méthode de cardan    .                              

Source

  • import java.util.InputMismatchException;
  • import java.util.Scanner;
  • public class TroisiemeDeg {
  • public static void main(String[] args) {
  • boolean continuation=true;
  • Scanner scan = new Scanner(System.in);
  • double a,b,c,d,gDelta,x,y,z,im,re,u,v,p,q,m,n,theta,k;
  • char verif;
  • do{
  • System.out.println("\n\nax^3+bx^2+cx+d=0");
  • System.out.println("Veuillez entrer les coefficients ");
  • try{
  • System.out.print("a = ");
  • a= scan.nextDouble();
  • while(a==0) {
  • System.out.println("a est different de 0!");
  • System.out.print("a = ");
  • a= scan.nextDouble();
  • }
  • System.out.print("b = ");
  • b= scan.nextDouble();
  • System.out.print("c = ");
  • c= scan.nextDouble();
  • System.out.print("d = ");
  • d= scan.nextDouble();
  • System.out.println("\nl'equation a resoudre est : "+a+"x^3+"+b+"x^2+"+c+"x+"+d+"=0\n");
  • p=(c/a)-(Math.pow(b, 2.0)/(3*Math.pow(a, 2.0)));
  • q=((2*Math.pow(b, 3.0))/(27*Math.pow(a, 3.0)))-((b*c)/(3*Math.pow(a, 2.0)))+(d/a);
  • gDelta=4*Math.pow(p, 3.0)+27*Math.pow(q, 2.0);
  • m=((-q)/2)+(0.5)*Math.sqrt(gDelta/27);
  • n=((-q)/2)-(0.5)*Math.sqrt(gDelta/27);
  • u=Math.pow(Math.abs(m), 1.0/3);
  • v=Math.pow(Math.abs(n), 1.0/3);
  • if(gDelta>0)
  • {
  • if (m<0) u=-u;
  • if (n<0) v=-v;
  • x=u+v;
  • x+=(-b)/(3*a);
  • re=(-x)/2;
  • im=(Math.sqrt(3)/2)*(u-v);
  • re+=(-b)/(3*a);
  • System.out.println("1 racine reelle:\n x = "+x+"");
  • System.out.println("2 racines complexes:\n" +
  • " y = "+re+"-"+im+"i , z = "+re+"+"+im+"i");
  • }
  • else if(gDelta==0)
  • {
  • if(b==0&c==0&&d==0)
  • System.out.println("1 racine reelle de multiplicite 3:\n x = y = z = 0 ");
  • else{
  • x=(3*q)/p;
  • x+=(-b)/(3*a);
  • y=(-3*q)/(2*p);
  • y+=(-b)/(3*a);
  • System.out.println("1 racine reelle simple:\n x = "+x+"");
  • System.out.println("1 racine reelle double:\n y = z = "+y+"");
  • }
  • }
  • else
  • {
  • k= (3*q)/((2*p)*Math.sqrt((-p)/3));
  • theta=Math.acos(k);
  • x= 2*Math.sqrt((-p)/3)*Math.cos(theta/3);
  • y= 2*Math.sqrt((-p)/3)*Math.cos((theta+2*Math.PI)/3);
  • z= 2*Math.sqrt((-p)/3)*Math.cos((theta+4*Math.PI)/3);
  • if (x>-1E-6 && x< 1E-6) x=0.0;
  • if (y>-1E-6 && y< 1E-6) y=0.0;
  • if (z>-1E-6 && z< 1E-6) z=0.0;
  • x+=(-b)/(3*a);
  • y+=(-b)/(3*a);
  • z+=(-b)/(3*a);
  • System.out.println("3 racines reelles:\n x = "+x+" , y = "+y+" , z = "+z+"");
  • }
  • }
  • catch (InputMismatchException e)
  • {
  • System.out.println("Vous devez introduire un nombre");
  • }
  • scan = new Scanner(System.in);
  • System.out.println("\nVoulez-vous continuer ? [o/n/?]");
  • verif=scan.next().charAt(0);
  • if (verif != 'o' && verif != 'O' && verif !='0')
  • continuation = false;
  • }while(continuation);
  • }
  • }
import java.util.InputMismatchException;
import java.util.Scanner;

public class TroisiemeDeg {

	
	public static void main(String[] args) {
	
		boolean continuation=true;
		Scanner scan = new Scanner(System.in);
		double a,b,c,d,gDelta,x,y,z,im,re,u,v,p,q,m,n,theta,k;
		char verif;

  do{
	  System.out.println("\n\nax^3+bx^2+cx+d=0");
		System.out.println("Veuillez entrer les coefficients ");
	  
	  try{
		  
		  System.out.print("a = ");
			
			a= scan.nextDouble();
			while(a==0)	{
				System.out.println("a est different de 0!");
				System.out.print("a = ");
				a= scan.nextDouble();
			   }
			System.out.print("b = ");
			b= scan.nextDouble();  
			System.out.print("c = ");
			c= scan.nextDouble();
			System.out.print("d = ");
			d= scan.nextDouble();	
			System.out.println("\nl'equation a resoudre est : "+a+"x^3+"+b+"x^2+"+c+"x+"+d+"=0\n");
			
			p=(c/a)-(Math.pow(b, 2.0)/(3*Math.pow(a, 2.0)));
			q=((2*Math.pow(b, 3.0))/(27*Math.pow(a, 3.0)))-((b*c)/(3*Math.pow(a, 2.0)))+(d/a);
     		gDelta=4*Math.pow(p, 3.0)+27*Math.pow(q, 2.0);
     		m=((-q)/2)+(0.5)*Math.sqrt(gDelta/27);
     		n=((-q)/2)-(0.5)*Math.sqrt(gDelta/27);
     		u=Math.pow(Math.abs(m), 1.0/3);
     		v=Math.pow(Math.abs(n), 1.0/3);
					
		  if(gDelta>0)
		  {
			  if (m<0) u=-u;
			  if (n<0) v=-v;
			  x=u+v;
			  x+=(-b)/(3*a);
			  re=(-x)/2;
			  im=(Math.sqrt(3)/2)*(u-v);
			  re+=(-b)/(3*a);
			  System.out.println("1 racine reelle:\n    x = "+x+"");
			  System.out.println("2 racines complexes:\n" +
						"    y = "+re+"-"+im+"i , z  = "+re+"+"+im+"i");		
			  	  
		  }
			
			
		  else if(gDelta==0)
			{
			  
			  if(b==0&c==0&&d==0)
				  System.out.println("1 racine reelle de multiplicite 3:\n    x = y = z = 0 ");
			  else{
				x=(3*q)/p;
				x+=(-b)/(3*a);
				y=(-3*q)/(2*p);
				y+=(-b)/(3*a);
				
				System.out.println("1 racine reelle simple:\n    x = "+x+"");
				System.out.println("1 racine reelle double:\n    y = z = "+y+"");
			  }
				
			}
		  else
		  {
			  k=  (3*q)/((2*p)*Math.sqrt((-p)/3));               
			  theta=Math.acos(k);
			  x= 2*Math.sqrt((-p)/3)*Math.cos(theta/3);
			  y= 2*Math.sqrt((-p)/3)*Math.cos((theta+2*Math.PI)/3);
			  z= 2*Math.sqrt((-p)/3)*Math.cos((theta+4*Math.PI)/3);
			  if (x>-1E-6 && x< 1E-6) x=0.0;
			  if (y>-1E-6 && y< 1E-6) y=0.0;
			  if (z>-1E-6 && z< 1E-6) z=0.0;
			  x+=(-b)/(3*a);
			  y+=(-b)/(3*a);
			  z+=(-b)/(3*a);
			  System.out.println("3 racines reelles:\n    x = "+x+" , y = "+y+" , z = "+z+""); 
			  
			  
		  }
		  
		  
	  }
	  
	  catch (InputMismatchException e)
	    {
	    	System.out.println("Vous devez introduire un nombre");
	    	
	    }
	  
	  scan = new Scanner(System.in);
	   System.out.println("\nVoulez-vous continuer ? [o/n/?]");	
		 verif=scan.next().charAt(0);
		if (verif != 'o' && verif != 'O' && verif !='0')
		 continuation = false; 
	  
	  
  }while(continuation);
		
		
		

	}

}

 Conclusion

Si vous avez des propositions n'hésitez pas a m'envoyer un message .


 Historique

06 juin 2008 17:33:59 :
j'ai rajouté le cas ou b=0,c=0 et d=0

 Sources de la même categorie

Source avec Zip CLASSE MATRICE par frankladen11
Source avec Zip Source avec une capture RÉSOLUTION D'ÉQUATION GRÂCE AU CALCUL DES DÉTERMINANTS par frankladen11
Source avec Zip TYPE DE DONNÉES ABSTRAIT GRAPHE par smutsonberg
Source avec Zip Source avec une capture SIMPLEXE ET DUAL par MrRenaud
Source avec Zip ALGORITHME DE BELLMAN, CALCUL DES TEMPS AU PLUS TÔT ET RECHE... par michaelcourcy2005

Commentaires et avis

Commentaire de EagleUnderscoreOne le 14/06/2008 17:26:20

Salut, je ne me souviens plus des détails de la méthode de Cardan, mais il y a quelque chose qui m'inquiète un peu dans ton code, ce sont ces lignes :

#  if (x>-1E-6 && x< 1E-6) x=0.0;
# if (y>-1E-6 && y< 1E-6) y=0.0;
# if (z>-1E-6 && z< 1E-6) z=0.0;

Pourrais-tu nous en dire un peu plus? Si le but est d'obtenir un résultat propre lissé des erreurs numériques dans les cas particuliers où x,y ou z devraient être nuls, alors je trouve ça dommage puisque ces erreurs se trouvent dans tous les calculs et pourquoi les lisser artificiellement dans ces cas précis? De plus, il se peut très bien que le résultat exact soit inférieur à 10^-6 et alors tu crées toi même une erreur énorme.
Je ne sais pas si c'était ton raisonnement, voilà pourquoi j'aimerais que tu en dises un peu plus, peut être à l'aide de quelques commentaires?

Commentaire de Nightman150 le 14/06/2008 23:07:51

ça serait mieux si tu mettait qques commentaires dans ton code (javadoc + commentaires avant les blocs de code).
Le commentaire servira à mieux faire comprendre ce que ton code fait. Et ça te sert quand tu veux reprendre ton
code un jour.

Commentaire de usef01 le 14/06/2008 23:56:26

j'ai rajouté ces conditions afin d'éviter des résultats du genre 2.386...E-16 qui peuvent créer des confusions chez certains utilisateurs inexpérimentés.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales