Complex numbers پیچیده نیستند.
فقط به اسمی نیاز دارند که کمتر نگرانکننده باشد.
آنقدر مفیدند، بهویژه در مهندسی و علوم، که R اعداد مختلط را در کنار integer، double، logical، character و raw بهعنوان انواع اتمی استاندارد در خود جای داده است.
یک عدد complex در R یک مقدار واحد است.
اما در کاربرد، میتوان آن را جفتی از اعداد در نظر گرفت.
این دو، به دلایل تاریخی تأسفبار، «حقیقی» و «موهومی» نامیده میشوند.
باز هم بهتر است روی سادگی بنیادین تمرکز کنید، نه روی اسمهای عجیب.
برای ساختن اعداد مختلط از دو عدد حقیقی، کافی است پسوند i را به بخش موهومی اضافه کنید.
2+3i
#> [1] 2+3i
typeof(2+3i)
#> [1] "complex"
برای ساختن یک عدد مختلط از متغیرهای حقیقی، نحوهی نگارش بالا کار نمیکند.
نوشتن r + imi تجزیهگر را گمراه میکند و باعث میشود فکر کند imi اسم یک متغیر (ناموجود) است.
یا بخش موهومی را در 1i ضرب کنید، یا از تابع [complex()][ref-complex] استفاده کنید:
r <- 2
im <- 3
r + im * 1i
#> [1] 2+3i
# must include the `real` and `imaginary` keywords
complex(real = r, imaginary = im)
#> [1] 2+3i
شاید بپرسید چرا i و نه j؟
بیشتر مهندسان j را ترجیح میدهند.
بیشتر دانشمندان و ریاضیدانان نماد ریاضی i را برای موهومی ترجیح میدهند، اما این نماد با کاربرد i به معنای جریان در مهندسی برق در تضاد است.
R حرف i را برگزید، Python حرف j را و Julia با انتخاب im از این جنجال کنار کشید.
هنگام جابهجایی میان زبانهای برنامهنویسی [علوم، فناوری، مهندسی و ریاضیات][wiki-STEM] احتیاط کنید.
برای دسترسی جداگانه به بخشهای یک عدد مختلط:
z <- 2+3i
Re(z) # real part
#> [1] 2
Im(z) # imaginary part
#> [1] 3
هر یک از این دو بخش میتواند صفر باشد و آنگاه ریاضیدانان ممکن است از «کاملاً حقیقی» یا «کاملاً موهومی» بودن عدد سخن بگویند. با این حال، در R همچنان یک عدد مختلط است.
1.2 + 0i
#> [1] 1.2+0i
typeof(1.2 + 0i)
#> [1] "complex"
2i
#> [1] 0+2i
typeof(2i)
#> [1] "complex"
شاید شنیده باشید که «i (یا j) ریشهی دوم -۱ است».
فعلاً تنها معنایش این است که بخش موهومی، طبق تعریف، در تساوی زیر صدق میکند:
1i * 1i == -1 # more precisely, 1i * 1i == -1 + 0i
#> [1] TRUE
این ایدهی سادهای است، اما به پیامدهای جالبی میانجامد.
بیشتر عملگرهایی که با اعداد اعشاری و صحیح به کار میروند، با اعداد مختلط هم کار میکنند:
z1 = 1.5 + 2i
z2 = 2 + 1.5i
z1 + z2 # addition
#> [1] 3.5+3.5i
z1 * z2 # multiplication
#> [1] 0+6.25i
z1 / z2 # division
#> [1] 0.96+0.28i
z1^2 # exponentiation
#> [1] -1.75+6i
2^z1 # another exponentiation
#> [1] 0.518895+2.780422i
بیشتر توابع ریاضی با ورودیهای مختلط کار میکنند.
علاوه بر Re() و Im()، چندین تابع دیگر هم وجود دارد که بهطور خاص برای اعداد مختلط مهماند.
Conj() بهسادگی علامت بخش موهومی یک عدد مختلط را معکوس میکند (از + به - یا برعکس).
abs(<complex number>) تضمینشده یک عدد حقیقی بدون بخش موهومی («اندازه»ی آن) برمیگرداند و Mod(<complex number>) معادل آن است.Arg(<complex number>) زاویهی فاز را بر حسب رادیان برمیگرداند.z1
#> [1] 1.5+2i
abs(z1)
#> [1] 2.5
Mod(z1) # same as previous
#> [1] 2.5
Conj(z1) # flip sign
#> [1] 1.5-2i
Arg(z1)
#> [1] 0.9272952
شما بهتازگی در یک سرویس تاکسی جدید استخدام شدهاید که تلاش میکند خود را از سایر گزینههای موجود در بازاری اشباعشده متمایز کند. برای رسیدن به این هدف، مدیرعامل تصمیم گرفته است در منهتن خدماتی فوقلوکس ارائه دهد، با متصدیانی در هر چهارراه که پیش و پس از سفر به مشتریان کمک کنند. حالا باید کدی بنویسید که به عملیات این سرویس کمک کند.
مدیرعامل شما تشخیص داده است که چون چیدمان خیابانهای منهتن عمدتاً شبکهای است، اعداد مختلط روشی راحت برای نمایش تقاطعهای خیابانها هستند. در این روش، اعداد حقیقی مثبت و منفی بهترتیب نمایندهی شرق و غرب هستند و اعداد موهومی مثبت و منفی بهترتیب نمایندهی شمال و جنوب.
چون ساختن یک عدد مختلط در R کمی، اِ... خاص است، به شما دستور داده شده است تابعی ساده برای عدد مختلط پیادهسازی کنید.
تابع simplex(a, b) را پیادهسازی کنید که دو عدد صحیح a و b را میگیرد.
عدد مختلط a+bi را برگردانید.
simplex(1, 1)
#> 1+1i
simplex(-3, 4)
#> -3+4i
وقتی مشتری تقاطع مقصد را بگوید، رانندههای شما مسیر رسیدن به آنجا را دریافت میکنند. این مسیرها در قالب یک عدد مختلط ارائه میشوند که بخش حقیقی آن شمار بلوکهایی را نشان میدهد که باید به شمال/جنوب رفت و بخش موهومی آن فاصلهی شرق/غرب را. برای هماهنگی با یک قطبنمای متعارف، مدیر پروژهی شما تصمیم گرفته است شمال در جهت موهومی مثبت و جنوب در جهت موهومی منفی باشد. به همین ترتیب، شرق در جهت حقیقی مثبت و غرب در جهت حقیقی منفی است.
تابع driver_directions(start, end) را پیادهسازی کنید که مختصات تقاطع شروع (start) و مختصات مقصد پایان (end) را میگیرد.
یک عدد مختلط برگردانید که نشان میدهد راننده باید چند بلوک به شرق/غرب + شمال/جنوب برود.
driver_directions(0+0i, 7+5i)
#> 7+5i
driver_directions(-2+3i, 4-5i)
#> 6-8i
از مشتری برای مسافتی که تاکسی باید طی کند هزینهای گرفته میشود. چون منهتن چیدمان خیابانی شبکهای دارد، تاکسیها فقط میتوانند در همین مسیرها حرکت کنند. این ساختار به معیاری برای فاصله منجر میشود که محدود به پیروی از خطوط شبکه است. این فاصله از جمع زدن تعداد خطوط پیمودهشده یا تعداد تقاطعهای طیشده بهدست میآید (یعنی بدون در نظر گرفتن تقاطع شروع). این معیار معمولاً فاصلهی منهتن یا نُرم L1 نامیده میشود.
تابع manhattan(start, end) را پیادهسازی کنید که تقاطعهای start و end را میگیرد.
فاصلهی منهتن بین تقاطعهای start و end را برگردانید.
manhattan(0+0i, 3+4i)
#> 7
manhattan(-2-3i, -1+1i)
#> 5
مدیرعامل توانست بانکهای سرمایهگذاری را با تأکید بر این نکته همراه کند که این سرویس نهتنها فوقلوکس است بلکه سبز هم هست، چون از کلاغهای آموزشدیده استفاده میکند تا پیامها را بین متصدیان تقاطعها جابهجا کنند (که اطلاعات مربوط به مسافران را برای تجربهای شخصیسازیشده منتقل میکنند). بهنظر میرسد هیچکدام از بانکهای سرمایهگذاری زحمت بررسی دقیق را به خود ندادند تا بفهمند چرا این سرویس دقیقاً دوستدار محیطزیست است، یا حتی چه نوع مدیرعاملی از آموزش دادن کلاغ در اوقات فراغتش لذت میبرد، چون پول سرمایهگذاری سرازیر شده است.
هزینهی این سرویس هم بر اساس مسافت طیشده محاسبه میشود. اما چون کلاغها میتوانند پرواز کنند، لازم نیست شبکهی جادهها را دنبال کنند و میتوانند کوتاهترین مسیر را انتخاب کنند. البته وقتی آسمانخراشهای عظیم وجود دارند این ممکن است درست نباشد، اما مدیرعامل این سرویس را در منهتنِ کانزاس (معروف به «The Little Apple») راه میاندازد، جایی که کلاغها بهراحتی میتوانند از روی ساختمانهای کوتاه پرواز کنند. تقاضای بالقوه برای چنین سرویسی در منهتنِ کانزاس و اینکه عابران محلی دربارهی پرواز این همه پرنده بالای سرشان چه حسی خواهند داشت، موضوعی برای روزی دیگر است.
تابع as_crow_flies(start, end) را پیادهسازی کنید که تقاطعهای start و end را میگیرد.
فاصلهی پرواز کلاغ بین آن دو را برگردانید.
as_crow_flies(0+0i, 3+4i)
#> 5
مدیرعامل شما کلاغها را طوری آموزش داده است که از مسیرهایی مشابه مسیرهای رانندهها پیروی کنند. اما مدیرعامل عاشق نیمکرهی جنوبی است و کلاغها را با قطبنمایی متفاوت از آنچه مدیر پروژهی شما برای بقیهی سیستم استفاده میکند آموزش داده است. معلوم میشود مدیرعامل شما فرد نسبتاً عجیبوغریبی است. در قطبنمای مدیرعامل، شمال در جهت موهومی منفی و جنوب در جهت موهومی مثبت است. این دقیقاً برعکس جهتهای شمال/جنوب رانندههاست، در حالی که شرق/غرب یکسان میماند.
تابع crows_directions(start, end) را پیادهسازی کنید که تقاطعهای start و end را میگیرد.
عدد مختلطی مشابه مسیرهای راننده برگردانید، اما با شمال/جنوب جابهجاشده.
driver_directions(0+0i, 7+5i)
#> 7-5i
driver_directions(-2+3i, 4-5i)
#> 6+8i