Complex numbers ليست معقدة.
إنها تحتاج فقط إلى اسم أقل إثارة للقلق.
إنها مفيدة جدًا، لا سيما في الهندسة والعلوم، حتى أن Python تتضمن complex كنوع عددي قياسي، إلى جانب الأعداد الصحيحة (ints) والأعداد العشرية (floats).
قيمة complex في Python هي في جوهرها زوج من الأعداد العشرية.
ويُطلق على هذين العددين الجزء «الحقيقي» والجزء «التخيلي»، لأسباب تاريخية مؤسفة.
ومرة أخرى، من الأفضل التركيز على البساطة الكامنة وراءها لا على الأسماء الغريبة.
هناك أسلوبان شائعان لإنشاء الأعداد المركبة.
complex(real, imag) تأخذ معاملين من النوع float:>>> z1 = complex(1.5, 2.0)
>>> z1
(1.5+2j)
يمكن لدالة البناء أيضًا تحليل مُدخل على شكل سلسلة نصية. وهذا قيد غريب: فهي تفشل إذا احتوت السلسلة النصية على مسافات.
>>> complex('4+2j')
(4+2j)
>>> complex('4 + 2j')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
<real part> + <complex part>j، أو <complex part>j فقط إذا كان الجزء الحقيقي صفرًا:>>> z2 = 2.0 + 1.5j
>>> z2
(2+1.5j)
والنتيجة النهائية مطابقة لاستخدام دالة البناء complex().
هناك قاعدتان تتعلقان بالجزء التخيلي من العدد المركب:
يُرمز إليه بالحرف j (وليس i كما قد ترى في كتب الرياضيات).
يجب أن يلي j عددًا مباشرةً، حتى لا يعتبره Python اسم متغير. وإذا لزم الأمر، استخدم 1j.
>>> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> type(1j)
<class 'complex'>
معظم المهندسين مرتاحون لاستخدام j.
أما معظم العلماء والرياضيين فيفضّلون الرمز الرياضي i اختصارًا لكلمة تخيلي، لكن هذا الرمز يتعارض مع استخدام i بمعنى تيار في الهندسة الكهربائية.
لذا، عند تصميم Python، انتصر المهندسون الكهربائيون.
للوصول إلى أجزاء العدد المركب كلٌّ على حدة:
>>> z2.real
2.0
>>> z2.imag
1.5
يمكن أن يكون أي من الجزئين صفرًا، وقد يتحدث الرياضيون حينها عن عدد «حقيقي تمامًا» أو «تخيلي تمامًا». لكنه يبقى مع ذلك عددًا مركبًا في Python:
>>> complex(0, 1)
1j
>>> type(complex(0, 1))
<class 'complex'>
>>> complex(1, 0)
(1+0j)
ربما سمعت أن «i (أو j) هو الجذر التربيعي للعدد -1».
في الوقت الحالي، كل ما يعنيه ذلك هو أن الجزء التخيلي بحكم التعريف يحقق المساواة
1j * 1j == -1 # => True
هذه فكرة بسيطة، لكنها تؤدي إلى نتائج مثيرة للاهتمام.
معظم operators المستخدمة مع الأعداد العشرية والصحيحة تعمل أيضًا مع الأعداد المركبة:
>>> z1 = (1.5+2j)
>>> z2 = (2+1.5j)
>>> z1 + z2 # addition
(3.5+3.5j)
>>> z1 - z2 # subtraction
(-0.5+0.5j)
>>> z1 * z2 # multiplication
6.25j
>>> z1 / z2 # division
(0.96+0.28j)
>>> z1 ** 2 # exponentiation
(-1.75+6j)
>>> 2 ** z1 # another exponentiation
(0.5188946835878313+2.7804223253571183j)
>>> 1j ** 2 # j * j == -1
(-1+0j)
شرح قواعد ضرب الأعداد المركبة وقسمتها خارج نطاق هذا المفهوم (ومن غير المرجح أن تحتاج إلى إجراء هذه العمليات «يدويًا» كثيرًا).
أي مقدمة رياضية أو في الهندسة الكهربائية عن الأعداد المركبة ستغطي هذا، إن أردت التعمق في الموضوع.
أو يمكنك تجربة تمرين Complex Numbers التدريبي على Exercism، حيث يمكنك تنفيذ صنف للأعداد المركبة يوفّر هذه العمليات انطلاقًا من المبادئ الأساسية.
القسمة الصحيحة غير ممكنة على الأعداد المركبة، لذا ستفشل العوامل // و% والدالة divmod() مع نوع العدد المركب.
هناك دالتان مُنفَّذتان للأنواع العددية وهما مفيدتان جدًا عند التعامل مع الأعداد المركبة:
<complex number>.conjugate() ببساطة بقلب إشارة الجزء التخيلي من العدد المركب (من + إلى - أو العكس).
abs(<complex number>) تُرجع عددًا حقيقيًا بلا جزء تخيلي.>>> z1
(1.5+2j)
>>> z1.conjugate() # flip the z1.imag sign
(1.5-2j)
>>> abs(z1) # sqrt(z1.real ** 2 + z1.imag ** 2)
2.5
cmath
تضم المكتبة القياسية في Python وحدة math مليئة بوظائف مفيدة للتعامل مع الأعداد الحقيقية.
كما تضم وحدة cmath مكافئة للتعامل مع الأعداد المركبة.
نشجعك على تصفح الوحدة وتجربتها بنفسك، لكن الفئات الرئيسية هي:
إليك مثالًا يستخدم بعض الثوابت:
>>> import cmath
>>> euler = cmath.exp(1j * cmath.pi) # Euler's equation
>>> euler.real
-1.0
>>> round(euler.imag, 15) # round to 15 decimal places
0.0
إذن، تعبير بسيط يستخدم ثلاثة من أهم الثوابت في الطبيعة، وهي e وi (أو j) وpi، يعطي النتيجة -1.
ويعتقد بعض الناس أن هذه أجمل نتيجة في الرياضيات كلها.
ويعود تاريخها إلى نحو عام 1740.
يمكنك تخطي هذا الجزء إن لم يكن يثير اهتمامك.
لقد كان غريبًا وجديدًا في القرن السادس عشر.
وبعد 500 عام، أصبح محوريًا في معظم فروع الهندسة والعلوم الفيزيائية.
اتضح أن الأعداد المركبة هي الأسلوب الأبسط لوصف أي شيء يدور أو أي شيء له خاصية شبيهة بالموجات. لذلك تُستخدم على نطاق واسع في الهندسة الكهربائية ومعالجة الصوت والفيزياء وألعاب الحاسوب والملاحة، على سبيل المثال لا الحصر.
يمكنك أن ترى الأشياء تدور. قد لا تجعل الأعداد المركبة العالم يدور، لكنها ممتازة في شرح ما يحدث نتيجةً لدوران العالم: انظر إلى أي صورة ساتلية لعاصفة كبيرة.
وبشكل أقل وضوحًا، الصوت شبيه بالموجات، والضوء شبيه بالموجات، والإشارات اللاسلكية شبيهة بالموجات، وحتى اقتصاد بلدك هو جزئيًا على الأقل شبيه بالموجات.
يمكن إنجاز الكثير من هذه المعالجة الموجية باستخدام الدوال المثلثية (sin() وcos())، لكن ذلك يصبح فوضويًا بسرعة.
التعامل مع الدوال الأسية المركبة أسهل بكثير.
هذا صحيح فقط إذا كنت تعيش في كهف وتجمع طعامك من الطبيعة.
وإذا كنت تقرأ هذا على أي نوع من الشاشات، فأنت تعتمد كليًا على بعض الإنجازات المفيدة في القرن العشرين التي تحققت بفضل استخدام الأعداد المركبة.
الرقائق شبه الموصلة.
خوارزمية التحويل السريع لفورييه (FFT).
التحويل السريع لفورييه تطبيق للأعداد المركبة، وهو حاضر في كل ما يتصل بنقل الصوت ومعالجة الصوتيات والصور والفيديو.
تستخدم صيغة MP3 وغيرها من الصيغ الصوتية FFT للضغط، ما يسمح بتخزين مزيد من الصوت في مساحة تخزين أصغر.
كما يستخدم ضغط JPEG وفيديو MP4، إلى جانب العديد من صيغ الصور والفيديو الأخرى، FFT للضغط.
وتُستخدم FFT أيضًا في المرشحات الرقمية التي تتيح لأبراج الهاتف الخلوي فصل إشارة هاتفك الشخصية عن إشارات الآخرين.
إذن، من المرجح أنك تستخدم تقنية تعتمد على حسابات الأعداد المركبة آلاف المرات في الثانية.