Equation troisieme degré cardan

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 829 fois - Téléchargée 15 fois

Contenu du snippet

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

Source / Exemple :


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 .

A voir également

Ajouter un commentaire

Commentaires

EagleUnderscoreOne
Messages postés
30
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
24 avril 2009
-
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?
Nightman150
Messages postés
30
Date d'inscription
vendredi 17 mai 2002
Statut
Membre
Dernière intervention
14 juin 2008
-
ç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.
usef01
Messages postés
3
Date d'inscription
mardi 3 juin 2008
Statut
Membre
Dernière intervention
14 juin 2008
-
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.