Accueil > > > ENSEMBLE COMPLEXE
ENSEMBLE COMPLEXE
Information sur la source
Description
Il existe différents types en java, caractère, boolean, entier, réel... Mais il n'existe pas de type complexe pour réaliser des opérations dans C, alors j'ai créé moi même une petite classe complexe qui permet de faire addition, soustraction, conjugaison, multiplication, division, inversion, racine nième et puissance nième.
Source
- public class Complexe {
-
- private double im;
- private double re;
- private double arg;
- private double mod;
-
- //##############################################
- //constructeurs (a+ib)
- //pour entrer a et b séparément
- public Complexe(double reel, double imag) {
- im = imag;
- re = reel;
- this.modArg();
- }
- //pour entrer le nombre sous la forme "a+ib"
- public Complexe(String aib) {
- this.decompose(aib);
- this.modArg();
- }
-
- //##############################################
- //méthodes annexes pour les constructeurs
- //permet de décomposer une string "a+ib" en 2 nombres, a et b
- private void decompose(String aib) {
- String a;
- String b;
- if(aib.indexOf("i") == 0 && aib.length() == 1){
- a = "0";
- b = "1";
- } else if(aib.indexOf("-") == 0 && aib.indexOf("i") == 1 && aib.length() == 2) {
- a = "0";
- b = "-1";
- } else if(aib.indexOf("+") != -1) {
- a = aib.substring(0,aib.indexOf("+"));
- b = aib.substring((aib.indexOf("+")+1), aib.indexOf("i"));
- if(b.length() == 0) {
- b = aib.substring((aib.indexOf("i")+1),aib.length());
- }
- } else if(aib.indexOf("-") != -1) {
- if(aib.indexOf("-") == 0) {
- a = "0";
- b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
- } else {
- a = aib.substring(0,aib.indexOf("-"));
- b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
- }
- if(b.length() == 1) {
- b = "-" + aib.substring((aib.indexOf("i")+1),aib.length());
- }
- } else if(aib.indexOf("i") != -1) {
- a = "0";
- b = aib.substring(0, aib.indexOf("i"));
- if(b.length() == 0) {
- b = aib.substring((aib.indexOf("i")+1),aib.length());
- }
- } else {
- a = aib;
- b = "0";
- }
- try {
- re = Integer.parseInt(a);
- im = Integer.parseInt(b);
- } catch(NumberFormatException e) {
- System.out.println("Erreur, Mauvais format de nombre");
- re = 0;
- im = 0;
- }
- }
- //méthode pour récupérer le module |z| et l'argument Arg(z) à partir des nombres a et b
- private void modArg() {
- mod = Math.sqrt((re*re + im*im));
- if(re != 0 && im != 0) {
- arg = Math.atan((im/re));
- } else if (re != 0 && im == 0) {
- if(im >= 0) {
- arg = 0;
- } else if(im < 0) {
- arg = Math.PI;
- }
- } else if(re == 0 && im != 0){
- if(im >= 0) {
- arg = Math.PI/2;
- } else {
- arg = -Math.PI/2;
- }
- }
- }
-
-
- //##############################################
- //Opérations sur les complexes
-
-
- //conjugué a+ib -> a-ib
- public Complexe conj() {
- Complexe conj = new Complexe(re, -im);
- return conj;
- }
-
- //addition (a+ib)+(c+id)
- public Complexe add(Complexe comp) {
- double imag = im + comp.getIm();
- double reel = re + comp.getRe();
- Complexe add = new Complexe(reel, imag);
- return add;
- }
-
- //soustraction (a+ib)-(c+id)
- public Complexe minus(Complexe comp) {
- double imag = im - comp.getIm();
- double reel = re - comp.getRe();
- Complexe minus = new Complexe(reel, imag);
- return minus;
- }
-
- // multiplication (a+ib)*(c+id)
- public Complexe time(Complexe comp) {
- double imag = im*comp.getRe() + re*comp.getIm();
- double reel = re*comp.getRe() - im*comp.getIm();
- Complexe time = new Complexe(reel, imag);
- return time;
- }
-
- //inversion 1/(a+ib)
- public Complexe inverse() {
- double imag = (-im)/(mod*mod);
- double reel = re/(mod*mod);
- Complexe inverse = new Complexe(reel, imag);
- return inverse;
- }
-
- //division (a+ib)/(c+id)
- public Complexe divide(Complexe comp) {
- return time(comp.inverse());
- }
-
- //puissance (a+ib)^x
- //pour les puissances 0 < x < 1, utiliser la racine (.root(int))
- //pour les puissances x < 0, meixu vaut faire la puissance |x| puis une inversion
- public Complexe pow(double x) {
- double argu = arg*x;
- double modu = Math.pow(mod, x);
- double imag = reduce(modu*Math.sin(argu));
- double reel = reduce(modu*Math.cos(argu));
- Complexe pow = new Complexe(reel, imag);
- return pow;
- }
-
- //racine xroot(a+ib) !!!ATTENTION: x != 0
- //racines entières seulement (sinon il y en a une infitinité)
- //Si x appartient à N, il y a x racines, raison pour laquelle cette méthode retourne un tableau
- //pour les racines 0 < x < 1, utiliser la puissance (.pow(int))
- //pour les racines x < 0, meixu vaut faire la racine |x| puis une inversion
- public Complexe[] root(int x) {
- Complexe[] root = new Complexe[x];
- double modu;
- double reel;
- double imag;
- double argu;
- if(x != 0 ) {
- modu = Math.pow(mod, (1/x));
- } else {
- modu = 0;
- }
- for(int i = 0; i < x; i++) {
- argu = (arg+2*i*Math.PI)/x;
- imag = reduce(modu*Math.sin(argu));
- reel = reduce(modu*Math.cos(argu));
- root[i]= new Complexe(reel, imag);
- }
- return root;
- }
-
-
- //################################################
- //Getters
- public double getIm() {
- return im;
- }
-
- public double getRe() {
- return re;
- }
-
- //#################################################
- //autres méthodes utiles
- //permet de réduire un nombre à 2 décimale seulement.
- //pour changer la réduction, il suffit de changer 1000
- //méthode utilisée dans les méthodes racines et puissance, peut être retirée facilement
- private double reduce(double nombre) {
- double n = nombre * 1000;
- n = (int)n;
- n = n / 1000;
- return n;
- }
-
- //redéfinition de la méthode toString(), pour qu'elle affiche le nombre sous la forme a+ib
- public String toString() {
- String out = "";
- if(re == 0) {
- if(im == 0) {
- out += "0";
- } else if(im == 1) {
- out += "i";
- } else if(im == -1) {
- out += "-i";
- } else {
- out += im + "i";
- }
- } else {
- out += re;
- if(im == 0) {
- out += "";
- } else if(im == 1) {
- out += "+i";
- } else if(im == -1) {
- out += "-i";
- } else if(im > 0){
- out += "+" + im + "i";
- } else {
- out += im + "i";
- }
- }
- return out;
- }
-
- //redéfinition de la méthode equals(), pour comparer si deux nombres complexes sont identiques
- //on ne peut pas évaluer si un nombre complexe est supérieur ou inférieur à un autre
- //on ne peut que savoir s'ils sont égaux (même partie réelle et même même partie imaginaire)
- public boolean equals(Object o) {
- if(o != null && o.getClass() == this.getClass()){
- Complexe comp = (Complexe) o;
- return (this.re == comp.getRe() && this.im == comp.getIm());
- } else {
- return false;
- }
- }
- }
public class Complexe {
private double im;
private double re;
private double arg;
private double mod;
//##############################################
//constructeurs (a+ib)
//pour entrer a et b séparément
public Complexe(double reel, double imag) {
im = imag;
re = reel;
this.modArg();
}
//pour entrer le nombre sous la forme "a+ib"
public Complexe(String aib) {
this.decompose(aib);
this.modArg();
}
//##############################################
//méthodes annexes pour les constructeurs
//permet de décomposer une string "a+ib" en 2 nombres, a et b
private void decompose(String aib) {
String a;
String b;
if(aib.indexOf("i") == 0 && aib.length() == 1){
a = "0";
b = "1";
} else if(aib.indexOf("-") == 0 && aib.indexOf("i") == 1 && aib.length() == 2) {
a = "0";
b = "-1";
} else if(aib.indexOf("+") != -1) {
a = aib.substring(0,aib.indexOf("+"));
b = aib.substring((aib.indexOf("+")+1), aib.indexOf("i"));
if(b.length() == 0) {
b = aib.substring((aib.indexOf("i")+1),aib.length());
}
} else if(aib.indexOf("-") != -1) {
if(aib.indexOf("-") == 0) {
a = "0";
b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
} else {
a = aib.substring(0,aib.indexOf("-"));
b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
}
if(b.length() == 1) {
b = "-" + aib.substring((aib.indexOf("i")+1),aib.length());
}
} else if(aib.indexOf("i") != -1) {
a = "0";
b = aib.substring(0, aib.indexOf("i"));
if(b.length() == 0) {
b = aib.substring((aib.indexOf("i")+1),aib.length());
}
} else {
a = aib;
b = "0";
}
try {
re = Integer.parseInt(a);
im = Integer.parseInt(b);
} catch(NumberFormatException e) {
System.out.println("Erreur, Mauvais format de nombre");
re = 0;
im = 0;
}
}
//méthode pour récupérer le module |z| et l'argument Arg(z) à partir des nombres a et b
private void modArg() {
mod = Math.sqrt((re*re + im*im));
if(re != 0 && im != 0) {
arg = Math.atan((im/re));
} else if (re != 0 && im == 0) {
if(im >= 0) {
arg = 0;
} else if(im < 0) {
arg = Math.PI;
}
} else if(re == 0 && im != 0){
if(im >= 0) {
arg = Math.PI/2;
} else {
arg = -Math.PI/2;
}
}
}
//##############################################
//Opérations sur les complexes
//conjugué a+ib -> a-ib
public Complexe conj() {
Complexe conj = new Complexe(re, -im);
return conj;
}
//addition (a+ib)+(c+id)
public Complexe add(Complexe comp) {
double imag = im + comp.getIm();
double reel = re + comp.getRe();
Complexe add = new Complexe(reel, imag);
return add;
}
//soustraction (a+ib)-(c+id)
public Complexe minus(Complexe comp) {
double imag = im - comp.getIm();
double reel = re - comp.getRe();
Complexe minus = new Complexe(reel, imag);
return minus;
}
// multiplication (a+ib)*(c+id)
public Complexe time(Complexe comp) {
double imag = im*comp.getRe() + re*comp.getIm();
double reel = re*comp.getRe() - im*comp.getIm();
Complexe time = new Complexe(reel, imag);
return time;
}
//inversion 1/(a+ib)
public Complexe inverse() {
double imag = (-im)/(mod*mod);
double reel = re/(mod*mod);
Complexe inverse = new Complexe(reel, imag);
return inverse;
}
//division (a+ib)/(c+id)
public Complexe divide(Complexe comp) {
return time(comp.inverse());
}
//puissance (a+ib)^x
//pour les puissances 0 < x < 1, utiliser la racine (.root(int))
//pour les puissances x < 0, meixu vaut faire la puissance |x| puis une inversion
public Complexe pow(double x) {
double argu = arg*x;
double modu = Math.pow(mod, x);
double imag = reduce(modu*Math.sin(argu));
double reel = reduce(modu*Math.cos(argu));
Complexe pow = new Complexe(reel, imag);
return pow;
}
//racine xroot(a+ib) !!!ATTENTION: x != 0
//racines entières seulement (sinon il y en a une infitinité)
//Si x appartient à N, il y a x racines, raison pour laquelle cette méthode retourne un tableau
//pour les racines 0 < x < 1, utiliser la puissance (.pow(int))
//pour les racines x < 0, meixu vaut faire la racine |x| puis une inversion
public Complexe[] root(int x) {
Complexe[] root = new Complexe[x];
double modu;
double reel;
double imag;
double argu;
if(x != 0 ) {
modu = Math.pow(mod, (1/x));
} else {
modu = 0;
}
for(int i = 0; i < x; i++) {
argu = (arg+2*i*Math.PI)/x;
imag = reduce(modu*Math.sin(argu));
reel = reduce(modu*Math.cos(argu));
root[i]= new Complexe(reel, imag);
}
return root;
}
//################################################
//Getters
public double getIm() {
return im;
}
public double getRe() {
return re;
}
//#################################################
//autres méthodes utiles
//permet de réduire un nombre à 2 décimale seulement.
//pour changer la réduction, il suffit de changer 1000
//méthode utilisée dans les méthodes racines et puissance, peut être retirée facilement
private double reduce(double nombre) {
double n = nombre * 1000;
n = (int)n;
n = n / 1000;
return n;
}
//redéfinition de la méthode toString(), pour qu'elle affiche le nombre sous la forme a+ib
public String toString() {
String out = "";
if(re == 0) {
if(im == 0) {
out += "0";
} else if(im == 1) {
out += "i";
} else if(im == -1) {
out += "-i";
} else {
out += im + "i";
}
} else {
out += re;
if(im == 0) {
out += "";
} else if(im == 1) {
out += "+i";
} else if(im == -1) {
out += "-i";
} else if(im > 0){
out += "+" + im + "i";
} else {
out += im + "i";
}
}
return out;
}
//redéfinition de la méthode equals(), pour comparer si deux nombres complexes sont identiques
//on ne peut pas évaluer si un nombre complexe est supérieur ou inférieur à un autre
//on ne peut que savoir s'ils sont égaux (même partie réelle et même même partie imaginaire)
public boolean equals(Object o) {
if(o != null && o.getClass() == this.getClass()){
Complexe comp = (Complexe) o;
return (this.re == comp.getRe() && this.im == comp.getIm());
} else {
return false;
}
}
}
Conclusion
Si vous trouvez des erreurs, dites le moi. Si vous ne comprenez pas certains points du code, dites moi, je commenterai plus spécifiquement.
Historique
- 01 décembre 2008 18:33:33 :
- Ajout d'une méthode equals(Complexe) pour savoir si deux nombres sont identiques.
- 01 décembre 2008 19:41:40 :
- Modification de la méthode decompose(String) afin qu'elle gère les nombres négatifs et "i" et "-i"
- 02 décembre 2008 20:22:36 :
- Quelques modifications dans la méthode decompose(String) et dans la méthode equals(Complexe)
- 04 décembre 2008 19:56:49 :
- Modification de la méthode .equals(Complexe) pour qu'elle reconnaisse si un objet est null
- 05 décembre 2008 11:21:52 :
- Modification de la méthode .equals(Object) pour qu'elle puisse comparer un complexe avec n'importe quel auter objet
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
{Graphics2D] Arc de Cercle [ par deejimy ]
Je récupère à partir d'un fichier txt, les coordonnées du centre de l'arc(x,y), le rayon r , l'angle de début d et l'angle de fin f. Je n'arrive pas à
[Math]Manipuler les exposant avec un float [ par djodjoo ]
Salut tous,Voilà mon problème, j'aimerais pouvoir manipuler les nombre tel qque 2.12E-4 par exemple.Ce que j'aimerais pouvoir faire : &
Math.pow(10, 10) me renvoit 2147483647 [ par alonsyl ]
bonjour,Math.pow(10, 10) me renvoit 2147483647 ! moi j'aimerais qu'il me renvoit 10^10 = 10000000000.que se passe t'il ? comment resoudre ce pbl ?merc
midlet j2me ou est passé java.lang.Math.log [ par misterzinzin ]
bonjour, je vien de commencer la programmation de midlet (java pour mobile) et je ne trouva pas la fonction permettant de calculer des logarithme dans
Calcul de mémoire ... [ par threadom ]
Bon d'abord j'explique ...En gros L_oStream.getFrameLength() me retourne un long qui m'indique combien de byte vont mettre retourné, et je veux stocke
Arrondi à n chiffres significatifs [ par juancho2786 ]
Bonsoir , je fais une méthode qui permet d'arrondir à n chiffres significatis seulement j'ai un problème. Par exemple lorsque le nombre à arrondir est
double != Double [ par lafolle24320 ]
Bonjour à tous, est ce que quelqu'un pourrait m'expliquer clairement la différence entre un double et un Double. En fait j'ai un calcul : avec beam en
Sortir un zéro avec un Math.random()*10+1 [ par daviddubois ]
Bonjour tout le monde,J'essaie d'avoir des chiffres de 0 à 10 avec un Math.random(), le problème est qu'il sort des chiffres entre 1 et 10.Il ne sort
la fonction Math.random() [ par dorine82 ]
bonjour,j'aimerais savoir comment utiliser deux threads chacun a son tour. si par exemple j' ai le thread A et le thread B , je dois avoir comme resul
tableau sans repitition [ par gigi00 ]
bonjourj ai besoin d' aide pour faire fonctioner se programmedans ce programme je veux réaliser un tableau de [9][9] et qui rempli aleatoirement les c
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|