Complex numbers پیچیده نیستند.
فقط به اسمی کمتر هشداردهنده نیاز دارند.
آنقدر مفیدند، بهویژه در مهندسی و علوم، که Python نوع complex را به عنوان یک نوع عددی استاندارد، در کنار اعداد صحیح (intها) و اعداد اعشاری (floatها)، گنجانده است.
یک مقدار 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) جذر منفی ۱ است».
فعلاً تنها معنایش این است که بخش موهومی طبق تعریف در این تساوی صدق میکند
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)
توضیح قواعد ضرب و تقسیم اعداد مختلط از حوزهی این مفهوم خارج است (و بعید است لازم باشد این عملیات را خیلی وقتها «دستی» انجام دهید).
هر مقدمهی ریاضی یا مهندسی برق دربارهی اعداد مختلط این را پوشش میدهد، اگر بخواهید در این موضوع عمیق شوید.
در غیر این صورت، Exercism یک تمرین عملی Complex Numbers دارد که میتوانید در آن یک کلاس عدد مختلط را با این عملیات از اصول اولیه پیادهسازی کنید.
تقسیم صحیح روی اعداد مختلط ممکن نیست، بنابراین عملگرهای // و % و تابع 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 را میدهد.
بعضیها معتقدند این زیباترین نتیجه در تمام ریاضیات است.
این به حدود سال ۱۷۴۰ برمیگردد.
این بخش را میتوان نادیده گرفت، مگر اینکه علاقهمند باشید.
در قرن شانزدهم عجیب و تازه بود.
۵۰۰ سال بعد، در مرکز بیشتر مهندسی و علوم فیزیکی قرار دارد.
معلوم میشود که اعداد مختلط سادهترین راه برای توصیف هر آنچه میچرخد یا هر آنچه خاصیت موجمانند دارد، هستند. پس به طور گسترده در مهندسی برق، پردازش صدا، فیزیک، بازیسازی رایانهای و ناوبری استفاده میشوند، تا فقط چند کاربرد را نام برده باشیم.
میتوانید ببینید که چیزها میچرخند. اعداد مختلط شاید دنیا را به گردش درنیاورند، اما برای توضیح آنچه اتفاق میافتد در نتیجهی چرخش دنیا عالیاند: به هر تصویر ماهوارهای از یک طوفان بزرگ نگاه کنید.
کمتر آشکار است که صدا موجمانند است، نور موجمانند است، سیگنالهای رادیویی موجمانند هستند و حتی اقتصاد کشور خودتان هم حداقل تا حدی موجمانند است.
بسیاری از این پردازش موجی را میتوان با توابع مثلثاتی (sin() و cos()) انجام داد، اما این خیلی سریع شلوغ میشود.
نماییهای مختلط بسیار راحتتر هستند.
فقط در صورتی درست است که در غاری زندگی کنید و برای غذای خود جستوجو کنید.
اگر این را روی هر نوع صفحهنمایشی میخوانید، کاملاً به پیشرفتهای مفید قرن بیستم وابستهاید که به کمک اعداد مختلط محقق شدهاند.
۱. تراشههای نیمهرسانا. - اینها در فیزیک کلاسیک بیمعنیاند و فقط با مکانیک کوانتومی (QM) میتوان آنها را توضیح داد (و طراحی کرد). - در QM، همه چیز طبق تعریف دارای مقدار مختلط است. (همهاش موج است تا پایین)
۲. الگوریتم تبدیل فوریهی سریع (FFT). - FFT یک کاربرد اعداد مختلط است و در همهچیز مرتبط با انتقال صدا، پردازش صدا، عکسها و ویدیو حضور دارد.
- MP3 و سایر قالبهای صوتی از FFT برای فشردهسازی استفاده میکنند و تضمین میکنند که صدای بیشتری در فضای ذخیرهسازی کوچکتری جا میشود.
- فشردهسازی JPEG و ویدیوی MP4، در کنار بسیاری از قالبهای دیگر تصویر و ویدیو، نیز از FFT برای فشردهسازی استفاده میکنند.
- FFT همچنین در فیلترهای دیجیتالی به کار میرود که به دکلهای تلفن همراه اجازه میدهند سیگنال شخصی شما را از سیگنال دیگران جدا کنند.
پس احتمالاً از فناوریای استفاده میکنید که به محاسبات اعداد مختلط هزاران بار در ثانیه وابسته است.