Les nombres complexes dans .NET (C #)


Je afficherons bientôt un peu de code pour la génération de Mandelbrot dans c #. Ici, je jeter les bases pour que les décrivant ces nombres complexes sont et comment nous pouvons traiter avec eux en C #.

Nombres complexes

Notez que 2 * (-2) = -4, mais il ya un certain nombre «réel» qui peut être multiplié par lui-même, afin de donner la réponse souhaitée, -4. Pour cela, nous introduisons le concept de nombre imaginaire. Mathématiciens donner un nom à la racine carrée de -1. Appelez-le. Par définition, si vous obtenez la place -1. Si nous élevons à la troisième puissance, nous obtenons -i, et si nous soulevons la quatrième puissance, nous sommes essentiellement Quadrature -1, alors faites 1. peuvent être multipliées et les numéros ajoutés dans le décor réel que 4 * i = 4i + 2e et 3e = 5. Cependant, 3 + 2i ne peut pas être encore simplifiée; est seulement 3 + 2i, et ce est en fait un nombre complexe. Un nombre complexe est un nombre qui se compose de deux parties; une partie réelle et une partie imaginaire. Opérations communes d'addition, soustraction, multiplication et division du travail un peu différent avec des nombres complexes. Pour utiliser les nombres complexes dans un langage orienté objet, nous pouvons construire une classe qui stocke ces deux parties et remplace opérateurs mathématiques afin que nous puissions ajouter et multiplier nos objets de nombres complexes. Stuff très intuitive!




Evolution du nombre

Les premiers numéros d'êtres humains ont été en mesure de donner un sens aux chiffres étaient «naturel»; 1,2,3 etc. Le concept de «zéro» n'a pas toujours existé en mathématiques et semble avoir été oublié et redécouvert plusieurs fois avant nous avons finalement accepté comme quelque chose qui nous aide à décrire avec précision notre réalité. Ont été introduits des nombres négatifs pour vous permettre de résoudre les problèmes que nous ne pouvions pas résoudre avant. Ils nous ont aidés à comprendre le concept de la dette et nous ont permis de résoudre de nouveaux types d'équations. Dans un premier temps, le concept de nombres négatifs était probablement très étranger, mais ils se sont déjà montré comment outil précieux pour vous permettre de mieux comprendre le monde qui nous entoure. Nombres rationnels dont les 2/3 ont été introduites et nombres comme pi et ont été découverts et qui nous amène à la notion de nombres irrationnels; numéros qui ne peuvent être exprimés en une fraction constituée d'entiers, mais sont décrits par une chaîne infinie de chiffres. OK, nombres imaginaires. Ce est là que les choses deviennent un peu étrange, mais il est important de se rappeler que les chiffres sont discutés prochaine implications mathématiques réels. Ils sont d'une grande importance dans la science et l'ingénierie, et le fait que nous les appelons «nombres imaginaires» ne signifie pas que je suis juste un inutiles mathématiques invention. Les nombres imaginaires se produisent il faut un mécanisme qui nous permettra d'affronter les racines carrées de nombres négatifs. Le carré d'un nombre est la valeur que vous obtenez lorsque vous multipliez le nombre par lui-même. Le carré de 2 (ou 2 au carré) est 4 parce que 2 * 2 = 4. La racine carrée d'un nombre est le nombre que vous multipliez par lui-même pour obtenir le nombre d'origine, puis la racine carrée de 9-3, parce 3 * 3 = 9. Nous savons que 2 * 2 = 4, et nous savons aussi que (-2) * (-2) = 4, car un déficit multiplié par la négative produit un positif. Donc, 2 et -2 sont deux réponses à la question "quelle est la racine carrée de 4?". Mais que faire si vous voulez poser la question «Quelle est la racine carrée de -4?"

Classe C # pour les nombres complexes

ComplexNumbers espace de noms { Complexe de classe { Privé _r Double; Privé _Je Double; Public Double R { obtenir {return _r; } ensemble {_r = valeur; } } publie Le Double { _Je Obtenir {return; } _Je ensemble {= valeur; } } Dans l'ensemble du public (Double réel, imaginaire Double) { _r = true; _Je = Imaginaire; } Complexe opérateur public static + (c1 complexe, complexe c2) { Double r = + c1.R c2.R; Double i = + c1.I c2.I; retourner nouveau complexe (r, s); } Complexe opérateur public static - (c1 complexe, complexe c2) { Double r = c1.R - ​​c2.R; Double i = c1.I - c2.I; retourner nouveau complexe (r, s); } opérateur public static * Complexe (c1 complexe, complexe c2) { Double r = c1.R c2.R * - * c1.I c2.I; Double i = c1.R c2.I * + * c2.R c1.I; retourner nouveau complexe (r, s); } Complexe opérateur public static/(c1 complexe, complexe c2) { Complexe tmp = nouveau complexe (c2.R, -c2.I); * C1 = tmp; * = C2 tmp; si (c2 == 0) throw new DivideByZeroException (); retour (c1 * (1/c2.R)); } statique == publique de l'opérateur booléen (c1 Complex, c2 Complex) { retourner (c1.R c2.R == == && c1.I c2.I); } opérateur booléen public static! = (C1 complexe, complexe c2) { (C1.R c2.R == == && c1.I c2.I) de retour!; } override public int GetHashCode () { retourner R.GetHashCode () ^ I.GetHashCode (); } public override string ToString () { = New StringBuilder de StringBuilder (); if (R! = 0) sb.Append (R.ToString ()); if (R! = 0 && I> 0) sb.Append ("+"); si (I <0) { if (R! = 0) sb.Append (""); sb.Append («-»); if (R! = 0) sb.Append (""); } if (R == 0 && je == 0) sb.Append ("0"); if (i! = 0) { if (Math.abs (I)! = 1) sb.Append (Math.abs (I) .ToString ()); sb.Append ("i"); } sb.ToString retour (); } Complexe opérateur implicite public static (double n) { retourner nouveau complexe (n, 0); } } }

opérateurs d'addition et de soustraction sont simples. Nous ajouter ou soustraire les deux composantes distinctes de chaque nombre complexe tout simplement. La multiplication est un peu plus compliqué. Chaque partie comporte deux volets que nous avons à traverser multiplient selon la méthode du papier d'aluminium. Multiplie deux complexes ensemble et vous verrez pourquoi il peut être écrit d'une manière que je faisais avant. La division de code pourrait ressembler un peu étrange, mais je suis fondamentalement rationaliser le dénominateur de se débarrasser du terme de fantaisie. Une excellente description de la façon de se multiplier et diviser des nombres complexes peut être trouvée ici. Notez que je ai défini un opérateur de conversion implicite de sorte que nous pouvons faire de bonnes choses de ce genre.


Complexe c = new Complex (-2, 1,6); Complexe Z = c + 5,2;

Dans cet exemple, 5 est implicitement converti à un type complexe qui a partie réelle et la partie imaginaire 5 0. De plus, la fusion signifie implicitement que nous ne avons pas besoin de surcharger chaque opérateur 3 fois à traiter, par exemple, l'ajout d'un flottante un complexe ou un complexe d'un flotteur. Dans mon prochain post, je serai avec cette classe pour produire une animation de Mandelbrot.

(0)
(0)

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha