Exercice : Nombres Complexes#
À faire
2025-2026
Extraire le code dans un fichier pour le compiler.
On rappelle qu’un nombre complexe est un nombre qui s’écrit \(a+ib\) où
\(a\) est appelé partie réelle et \(b\) partie imaginaire. Il faudra
systématiquement passer deux float, pour passer un nombre complexe
en paramètre.
Attention, dans tout cet exercice, faire bien attention à quels sont les paramètres qui sont des résultats et quels sont ceux qui sont des données.
Définissez une procédure
saisiequi demande à l’utilisateur d’entrer un nombre complexe, et qui a pour résultat le nombre complexe entré par l’utilisateur.BEGIN SOLUTION
void saisie(double &r, double &i) { cout << "Partie réelle : " << endl; cin >> r; cout << "Partie imaginaire : " << endl; cin >> i; }
END SOLUTION
Définissez une procédure
affichequi affiche un nombre complexe.BEGIN SOLUTION
void affiche(double r, double i) { if (i >= 0) cout << r << "+" << i << "i" << endl; else cout << r << "-" << -i << "i" << endl; }
END SOLUTION
Définissez une procédure
sommequi calcule la somme de deux nombres complexes.BEGIN SOLUTION
void somme(double r1, double i1, double r2, double i2, double &sommer, double &sommei) { sommer = r1 + r2; sommei = i1 + i2; }
END SOLUTION
Définissez une procédure
produitqui calcule le produit de deux nombres complexes. On rappelle que \((a+ib)\times(c+id) = (ac-bd)+i(ad+bc)\).BEGIN SOLUTION
void produit(double r1, double i1, double r2, double i2, double &prodr, double &prodi) { prodr = r1*r2 - i1*i2; prodi = i1*r2 + i2*r1; }
END SOLUTION
Définissez une fonction
norme_carrequi renvoie le carré de la norme d’un nombre complexe. On rappelle que $\(|a+ib|^2 = a^2+b^2\,.\)$BEGIN SOLUTION
double norme_carree(double r, double i) { return r*r + i*i; }
END SOLUTION
Définissez une procédure
inversequi renvoie l’inverse d’un nombre complexe. On rappelle que $\({1\over a+ib} = {a-ib\over|a+ib|^2}\,.\)$BEGIN SOLUTION
void inverse(double r, double i, double &invr, double &invi) { double norme; norme = norme_carree(r, i); if (norme == 0) { cout << "Inverse de 0"; exit(1); } invr = r/norme; invi = -i/norme; }
END SOLUTION
Difficile : L’algorithme de calcul de la racine carrée fonctionne en général sur les nombres complexes \(z = a+ib\): la suite
\[u_0 := z, \qquad u_{n+1} := {u_n + z / u_n\over2}\]converge (presque toujours, voir la question suivante) vers une racine carrée de \(z\). Définissez une procédure
racinequi calcule la racine carrée d’un nombre complexe. On considère que l’approximation \(u\) est correcte si $\({|u^2-z|\over|a|} < 10^{-6}\,, \qquad\hbox{c'est-à-dire si}\qquad {|u^2-z|^2\over|z|^2} < 10^{-12}\,.\)$BEGIN SOLUTION
double erreur(double ur, double ui, double ar, double ai) { double u2r, u2i; double sommer, sommei; produit(ur, ui, ur, ui, u2r, u2i); somme(u2r, u2i, -ar, -ai, sommer, sommei); return norme_carree(sommer, sommei) / norme_carree(ar, ai); } void racine_carree(double ar, double ai, double &raciner, double &racinei) { double unr, uni; double invr, invi; double prodr, prodi; double sommer, sommei; unr = ar; uni = ai; while (erreur(unr, uni, ar, ai) >= epsilon*epsilon) { inverse(unr, uni, invr, invi); produit(ar, ai, invr, invi, prodr, prodi); somme(unr, uni, prodr, prodi, sommer, sommei); unr = 1.0/2.0*sommer; uni = 1.0/2.0*sommei; } raciner = unr; racinei = uni; }
END SOLUTION
Difficile : En fait, la suite précédente ne converge pas dans le cas particulier où \(a\) est un réel négatif. On pourra dans ce cas choisir \(u_0 = a + i\epsilon\). Modifier le programme en conséquence.
BEGIN SOLUTION
if (ai == 0 && ar < 0) uni += epsilon;
END SOLUTION