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
MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril SHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KITSHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KIT par Matthew
http://www.microsoft.com/download/en/details.aspx?id=28768&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MicrosoftDownloadCenter+(Microsoft+Download+Center) ...
Cliquez pour lire la suite de l'article par Matthew
Forum
APPLICATION JARAPPLICATION JAR par yasseramiral
Cliquez pour lire la suite par yasseramiral
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|