ویژگی تصویر

کتابخانه cmath در پایتون — مرجع کامل برای محاسبات مختلط

  /  پایتون   /  کتابخانه cmath در پایتون
بنر تبلیغاتی الف

در پایتون، کتابخانه cmath مجموعه‌ای از توابع برای کار با اعداد مختلط را فراهم می‌کند. این ماژول معادل math برای اعداد حقیقی است ولی برای حالت‌های مختلط طراحی شده و عملیات مثل جذر، لگاریتم، توابع مثلثاتی و نمایی را برای اعداد پیچیده به‌صورت استاندارد و قابل اعتماد انجام می‌دهد. در این مقاله به کاربردها، توابع مهم، نکات دقیق عددی و مثال‌های عملی می‌پردازیم.

چرا cmath؟ چه تفاوتی با math دارد

ماژول math توابعی برای اعداد حقیقی دارد و روی اعداد مختلط عمل نمی‌کند. اگر بخواهید جذر یا لگاریتم عددی منفی را محاسبه کنید، math خطا می‌دهد؛ اما cmath نتایج مختلط را بازمی‌گرداند. همچنین cmath رفتار شاخه‌ای (branch cut) برای لگاریتم و آرگومان را رعایت می‌کند که در کاربردهای مهندسی اهمیت دارد.

توابع پایه‌ای و پرکاربرد

  • abs(z): قدر مطلق (مقدار) عدد مختلط
  • phase(z): آرگومان (زاویه) در بازه (-π, π]
  • polar(z): تبدیل به صورت قطبی (r, θ)
  • rect(r, θ): بازگشت از قطبی به کارتزین
  • sqrt, exp, log, log10
  • sin, cos, tan و معکوس‌هایشان
  • conjugate: مزدوج مختلط (z.conjugate())
  • isfinite, isinf, isnan
تابعتوضیح مختصر
cmath.sqrt(z)جذر اصلی عدد مختلط
cmath.exp(z)تابع نمایی e^z
cmath.log(z[, base])لگاریتم طبیعی؛ در صورت تعیین base، log به آن پایه بازگردانده می‌شود
cmath.polar(z)بازگشت (r, θ)
cmath.rect(r, θ)بازسازی عدد از مختصات قطبی

مثال‌های کاربردی

1) حل معادله درجه دوم که دلتا (discriminant) منفی دارد:

import cmath

a, b, c = 1, 2, 5
d = b*b - 4*a*c
root1 = (-b + cmath.sqrt(d)) / (2*a)
root2 = (-b - cmath.sqrt(d)) / (2*a)
print(root1, root2)

این قطعه کد ریشه‌های مختلط را محاسبه می‌کند. cmath.sqrt به‌درستی جذر دلتا منفی را به صورت عدد مختلط می‌دهد و با فرمول استاندارد درجه دوم ریشه‌ها بازگشت داده می‌شوند.

2) تبدیل به/از مختصات قطبی و محاسبه فاز:

import cmath
z = 1 - 1j
r, theta = cmath.polar(z)
z_back = cmath.rect(r, theta)
print(r, theta)
print(z_back)

در این نمونه cmath.polar قدر (r) و زاویه (theta) را برمی‌گرداند. سپس با cmath.rect همان عدد بازسازی می‌شود. این تبدیل‌ها در تحلیل‌های فرکانسی، نمایندگی فاز و پردازش سیگنال بسیار کاربردی‌اند.

3) استفاده از فرمول اویلر و توابع نمایی و مثلثاتی:

import cmath
# e^(i*pi) = -1
val = cmath.exp(1j * cmath.pi)
print(val)  # تقریبا -1

# معکوس تانژانت مختلط
z = 0.5 + 1j
atan_z = cmath.atan(z)
print(atan_z)

نمایش e^(iπ) نشان‌دهندهٔ همبستگی بین توابع نمایی و مثلثاتی است. توابع معکوس نیز در تحلیل‌های کنترل و سیگنال برای برگرداندن فاز کاربرد دارند.

4) تولید مجموعه مندلبروت (مثالی ساده برای نمایش کاربرد در گرافیک و تحلیل پیچیدگی):

def mandelbrot(c, max_iter=100):
    z = 0+0j
    for n in range(max_iter):
        z = z*z + c
        if abs(z) > 2:
            return n
    return max_iter

# آزمایش برای یک مختصات نمونه
print(mandelbrot(-0.75 + 0.1j))

این تابع با استفاده از ضرب مختلط و قدر مطلق، تعداد تکرارهایی را که مقدار فرار می‌کند محاسبه می‌کند؛ برای تصویرسازی مجموعه مندلبروت می‌توان این الگوریتم را روی یک شبکه از نقاط اجرا و رنگ‌بندی کرد.

نکات عددی و شاخه‌ها (Branch cuts)

توابع چندمقداره مانند لگاریتم و آرگومان در حوزهٔ مختلط شاخهٔ اصلی را بازمی‌گردانند. مثلاً cmath.phase مقدار آرگومان را در بازه (-π, π] ارائه می‌دهد و cmath.log روی شاخهٔ اصلی تعریف شده است. هنگام کار با پیچ و خم‌های تحلیلی (analytic continuation) باید دقت کنید که شاخهٔ مورد نظر را صریحاً مدیریت کنید.

همچنین مراقب مقایسه مستقیم مقادیر مختلط اعشاری باشید؛ به دلیل خطای شناور (floating point) بهتر است از آستانه یا تقریب نسبی استفاده کنید.

مقایسه با numpy و بهینه‌سازی

اگر داده‌ها به‌صورت آرایه‌ای بزرگ هستند، استفاده از numpy (np.sqrt، np.exp برای dtype=complex) بسیار سریع‌تر و بهینه‌تر است چون عملیات برداری شده انجام می‌دهد. cmath برای یک عدد یا تعداد کمی عدد مناسب است. برای کارهای عددی سنگین یا پردازش تصویر/سیگنال، معمولاً ترکیب numpy و قابلیت‌های پیچیدهٔ آن پیشنهاد می‌شود.

توابع حساس به اعتبار ورودی

توابعی مثل cmath.isfinite، cmath.isinf و cmath.isnan برای بررسی وضعیت عناصر مختلط کاربرد دارند. مثلاً اگر محاسباتی منجر به تقسیم بر صفر یا overflow شود، می‌توان با این توابع وضعیت را مدیریت کرد و از انتشار NaN جلوگیری نمود.

نمونهٔ کامل‌تر: لگاریتم با پایه دلخواه و بررسی شاخه

import cmath
z = -1 + 0j
# لگاریتم طبیعی
ln = cmath.log(z)
# تبدیل به لگاریتم پایه 10
log10 = cmath.log(z, 10)
print("ln:", ln)
print("log10:", log10)

این مثال نشان می‌دهد که cmath.log مقدار لگاریتم طبیعی را با شاخهٔ اصلی بازمی‌گرداند؛ برای z=-1 مقداری برابر iπ می‌دهد. هنگام تغییر پایه، تابع مقدار را به آن پایه تبدیل می‌کند. توجه کنید که ln(-1)=iπ تنها در شاخهٔ اصلی است؛ شاخه‌های دیگر با اضافه یا کم کردن 2πi حاصل می‌شوند.

نکات عملی و بهترین تجربیات

  • از cmath برای محاسبات مختلط اسکالر استفاده کنید؛ برای آرایه‌ها از numpy بهره ببرید.
  • همیشه هنگام مقایسه اعداد مختلط از بافر (tolerance) استفاده کنید.
  • در محاسبات تحلیلی به شاخهٔ لگاریتم و آرگومان توجه کنید؛ اگر نیاز به شاخهٔ متفاوتی دارید، باید آن را به‌طور صریح مدیریت کنید.
  • در کاربردهای مهندسی (پردازش سیگنال، الکترونیک، کنترل) توابع polar/rect و phase بسیار مفیدند.

کتابخانه cmath ابزار قدرتمندی برای کار با اعداد مختلط در پایتون است؛ با آگاهی از محدودیت‌های شاخه‌ای و نکات عددی می‌توانید محاسبات پیچیده را به‌صورت دقیق و کارآمد انجام دهید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: