Bonjour,
Les nombres complexes peuvent s'écrie sous l'une des trois formes: algébrique, polaire (ou trigonométrique), exponentielle:
Forme
algébrique: z = [a+i·b], avec i² = -1
polaire: z = ρ·[cosθ+i·sinθ], avec ρ = √(a² + b²), cosθ = a/ρ, sinθ = b/ρ
exponentielle: z = ρ·eⁱᶱ
Les sites qui décrivent les nombres complexes ne manquent pas sur le Net et également dans CodeS-SourceS (voir quelques liens ci-dessous).
Avec
Microsoft Visual Studio 14.0 (qui utilise le fichier
complex du 01/06/2016), le code du Zip
ComplexLib.cpp:
#include <iostream>
#include <complex>
#define Reel double
void Out(char *s, std::complex<double> z) {
char *ss = "+i";
double im = imag(z);
if (im < 0.0) {ss = "-i"; im = -im;}
std::cout << s << '[' << real(z) << ss << char(250) << im << "]";
} // char(250) = '·' sur la console
#define NL std::cout << ";n"
int main() {
const Reel pi=(Reel)3.14159265358979323846;
const std::complex<double> x(-5,4), y(3,2.1), z(7,-4.88);
std::complex<double> v;
std::cout << "Nombres complexes B: avec struct std::complex<double>n";
Out("nA: x = ", x); Out(", y = ", y); Out(", z = ", z);
v=17; Out("nB: v=17 = ", v); v=z; Out(", v = z = ", v);
std::cout << "nC: x==y ? " << ((x==y) ? "true" : "false");
std::cout << ", x!=y ? " << ((x!=y) ? "true" : "false");
Out("nD: +z = ", +z);
Out(", -z = ", -z);
Out("nE: x+y = ", x+y);
v=z; Out("; v=z, v+=x = ", v+=x);
v=z; Out("; v=z, v+=6 = ", v+=6);
// Out("nE': 3+x = ", 3+x); Out(", x+4 = ", x+4);
Out("nF: x-y = ", x-y);
v=z; Out("; v=z, v-=x = ", v-=x);
v=z; Out("; v=z, v-=6 = ", v-=6);
// Out("nF': 3-x = ", 3-x); Out(", x-1 = ", x-1);
Out("nG: x*y = ", x*y);
v=z; Out("; v=z, v*=x = ", v*=x);
v=z; Out("; v=z, v*=6 = ", v*=6);
// Out("nG': 3*x = ", 3*x); Out(", x*4 = ", x*4);
Out("nH: x/y = ", x/y);
v=z; Out("; v=z, v/=x = ", v/=x);
v=z; Out("; v=z, v/=6 = ", v/=6);
// Out("nH': 3/x = ", 3/x); Out(", x/2.5 = ", x/2.5);
// Out("nI': 3+1/x+z/y-5*x*y = ", 3+1/x+z/y-5*x*y);
std::cout << "nJ: norm(z) = " << norm(z) << ", abs(z) = " << abs(z);
std::cout << ", arg(z) = " << arg(z);
Out("nK: conj(z) = ", conj(z));
Out("nL: cos(z) = ", cos(z)); Out(", cosh(z) = ", cosh(z));
Out("nM: exp(z) = ", exp(z));
Out("nN: log(z) = ", log(z)); Out(", log10(z) = ", log10(z));
// Out("nO': polar(5, pi/6) = ", polar(5, pi/6));
Out("nP: pow(z, 3) = ", pow(z, 3)); Out(", pow(z, 1.5) = ", pow(z, 1.5));
Out(", pow(z, x) = ", pow(z, x));
Out("nQ: sin(z) = ", sin(z)); Out(", sinh(z) = ", sinh(z));
v=sqrt(z); Out("nR: v = sqrt(z) = ", v); Out(", v*v = ", v*v);
Out("nS: tan(z) = ", tan(z)); Out(", tanh(z) = ", tanh(z));
std::cout << "nnEquation du second degre a coefficients complexes:";
std::cout << " a*x*x + b*x + c = 0.nAvec ";
std::complex<double> a(-5,4), b(6,3), c(1,-7);
std::complex<double> D, srD, x1, x2; // D = Discr, srD = √D, x1,x2 = solutions
std::complex<double> k2 = 2, k4 = 4;
Out("a = ", a); Out(", b = ", b); Out(", c = ", c);
Out(", k2 = ", k2); Out(", k4 = ", k4);
D = b*b - k4*a*c; srD = sqrt(D);
Out("n posons D = b*b - k4*a*c = ", D); Out(", srD = sqrt(D) = ", srD);
x1 = (-b + srD)/(k2*a); x2 = (-b - srD)/(k2*a);
Out("n x1 = (-b + srD)/(k2*a) = ",x1);
Out("n x2 = (-b - srD)/(k2*a) = ",x2);
Out("nControl 1: a*x1*x1 + b*x1 + c = ", a*x1*x1 + b*x1 + c);
Out("nControl 2: a*x2*x2 + b*x2 + c = ", a*x2*x2 + b*x2 + c);
getchar();
}
donne les résultats suivants:
Nombres complexes B: avec struct std::complex<double>
A: x = [-5+i·4], y = [3+i·2.1], z = [7-i·4.88]
B: v=17 = [17+i·0], v = z = [7-i·4.88]
C: x==y ? false, x!=y ? true
D: +z = [7-i·4.88], -z = [-7+i·4.88]
E: x+y = [-2+i·6.1]; v=z, v+=x = [2-i·0.88]; v=z, v+=6 = [13-i·4.88]
F: x-y = [-8+i·1.9]; v=z, v-=x = [12-i·8.88]; v=z, v-=6 = [1-i·4.88]
G: x*y = [-23.4+i·1.5]; v=z, v*=x = [-15.48+i·52.4]; v=z, v*=6 = [42-i·29.28]
H: x/y = [-0.49217+i·1.67785]; v=z, v/=x = [-1.32976-i·0.0878049]; v=z, v/=6 = [1.16667-i·0.813333]
J: norm(z) = 72.8144, abs(z) = 8.53314, arg(z) = -0.608806
K: conj(z) = [7+i·4.88]
L: cos(z) = [49.6212+i·43.2373], cosh(z) = [91.4743+i·540.632]
M: exp(z) = [182.948+i·1081.27]
N: log(z) = [2.14396-i·0.608806], log10(z) = [0.931109-i·0.264401]
P: pow(z, 3) = [-157.102-i·601.146], pow(z, 1.5) = [15.2354-i·19.7286], pow(z, x) = [0.000147522-i·0.00020478]
Q: sin(z) = [43.2423-i·49.6155], sinh(z) = [91.4741+i·540.633]
R: v = sqrt(z) = [2.78686-i·0.875539], v*v = [7-i·4.88]
S: tan(z) = [0.000114343-i·0.999984], tanh(z) = [1+i·5.47112e-07]
Equation du second degre a coefficients complexes: a*x*x + b*x + c = 0.
Avec a = [-5+i·4], b = [6+i·3], c = [1-i·7], k2 = [2+i·0], k4 = [4+i·0]
posons D = b*b - k4*a*c = [-65-i·120], srD = sqrt(D) = [5.97802-i·10.0368]
x1 = (-b + srD)/(k2*a) = [-0.6346+i·0.795997]
x2 = (-b - srD)/(k2*a) = [1.07362+i·0.155222]
Control 1: a*x1*x1 + b*x1 + c = [0+i·1.77636e-15]
Control 2: a*x2*x2 + b*x2 + c = [-1.77636e-15+i·1.77636e-15]
Les instructions mises en commentaire correspondent à des fonctions ou opérations non gérées par la bibliothèque
<complex> référencée ci-dessus.
Qu'en est-il des versions plus modernes ?
A titre d'exemple, j'ai ajouté un code pour la résolution d'une équation du second degré à coefficients complexes: a*x*x + b*x + c = 0.
On y constate notamment qu'on ne peut pas directement écrire l'instruction "habituelle"
D = b*b - 4*a*c.
Le prochain article
Nombres complexes B: ... présentera une bibliothèque sous forme de
struct.
Son contenu sera testé avec les résultats ci-dessus.
Bonne lecture ...
Liens
WikipédiA: Nombre complexe
WikipédiA: Formule d'Euler
WikipediA: Euler's formula
Villemin: NOMBRES COMPLEXES
CodeS-SourceS: Nombres complexes ( c++, classe )
CodeS-SourceS: Resolution d'equations (jusqu'au 3eme degre)
CodeS-SourceS: Nombres complexes - complex numbers
EasyCalculation: Complex Number Calculator
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.