φυβλαςのβλογ
บล็อกของ phyblas



การจัดการกับจำนวนเชิงซ้อนใน python
เขียนเมื่อ 2016/06/08 23:34
แก้ไขล่าสุด 2022/07/16 19:42
ในเนื้อหาภาษาไพธอนเบื้องต้นบทที่ ๓ ซึ่งกล่าวถึงเรื่องตัวแปรและชนิดของข้อมูลไปนั้นได้แนะนำไปว่าภาษาไพธอนมี ชนิดข้อมูลชนิดจำนวนเชิงซ้อนอยู่ด้วย นั่นคือ complex

เพียงแต่ว่าตลอดเนื้อหาหลักนั้นแทบจะไม่มีการพูดถึงจำนวนเชิงซ้อนเลย นั่นเป็นเพราะว่าในการใช้งานโดยส่วนใหญ่นั้นมักจะไม่จำเป็นต้องใช้

อย่างไรก็ตามสำหรับงานวิจัยทางวิทยาศาสตร์แล้วบ่อยครั้งที่เราอาจต้องยุ่งกับ จำนวนเชิงซ้อน แม้ว่าจะเป็นสิ่งที่เข้าใจยากแต่ก็ไม่อาจเลี่ยงได้ ดังนั้นก็จำเป็นต้องมาเรียนรู้ไว้สักหน่อย

จำนวนเชิงซ้อนคือจำนวนที่ประกอบไปด้วยส่วนจริงและส่วนจินตภาพ

ในภาษาไพธอนส่วนจินตภาพถูกเขียนแทนด้วยตัว j ตามหลังตัวเลข


การสร้างจำนวนเชิงซ้อน
การสร้างข้อมูลชนิดจำนวนเชิงซ้อนขึ้นมาทำได้โดยพิมพ์ตัวเลขในรูปแบบส่วนจริงบวกส่วนจินตภาพ เช่น
z = 1+3j
print(z) # ได้ (1+3j)
print(type(z)) # ได้ <type 'complex'>

ให้ระวังไว้ด้วยว่าแม้ส่วนจินตภาพจะมีค่า 1 ก็ไม่อาจละเลข 1 หน้าตัว j ได้ เพราะถ้าไม่มีเลขนำหน้าตัว j จะถูกตีความเป็นตัวแปรธรรมดาตัวหนึ่ง

ในไพธอน 3 จำนวนเชิงซ้อนยังสามารถสร้างขึ้นจากการนำจำนวนจริงติดลบมายกกำลังด้วย
print((-20)**0.5) # ได้ (2.7383934913210134e-16+4.47213595499958j)

แต่ถ้าทำแบบนี้ในไพธอน 2 จะขึ้นว่า ValueError: negative number cannot be raised to a fractional power

อีกวิธีในการสร้างคือใช้ฟังก์ชัน complex โดยใส่อาร์กิวเมนต์ตัวแรกเป็นส่วนจริง ตัวหลังเป็นส่วนจินตภาพ หรือถ้าใส่แค่ตัวเดียวก็จะได้ส่วนจินตภาพเป็น 0
print(complex(4,6.1)) # ได้ (4+6.1j)
print(complex(4)) # ได้ (4+0j)
print(complex(0,6.1)) # ได้ 6.1j



แอตทริบิวต์และเมธอดภายในจำนวนเชิงซ้อน
จำนวนเชิงซ้อนประกอบด้วยส่วนจริงและส่วนจินตภาพ ซึ่งสามารถดูค่าได้โดยดูที่แอตทริบิวต์ real กับ imag
print((1+13j).real) # ได้ 1
print((1+13j).imag) # ได้ 13

สำหรับการสังยุค (การกลับค่าความเป็นบวกลบของส่วนจินตภาพ) ทำได้โดยใช้เมธอด conjugate
print((1+13j).conjugate()) # ได้ (1-13j)



การแสดงจำนวนเชิงซ้อนในรูปพิกัดเชิงขั้ว
จำนวนเชิงซ้อนนอกจากจะแสดงในรูป x+yi แล้วยังสามารถแสดงได้ในรูปของพิกัดเชิงขั้วดังนี้


โดยที่ r คือค่าสัมบูรณ์และ θ คือมุมเฟส

การจะแปลงเป็นพิกัดเชิงชั้วต้องใช้ฟังก์ชันจากมอดูล cmath ซึ่งเป็นมอดูลสำหรับจัดการกับจำนวนเชิงซ้อนโดยเฉพาะ

เราสามารถแปลงจำนวนเชิงซ้อนให้เขียนอยู่ในรูปของ r และ θ ได้โดยใช้ฟังก์ชัน polar ใน cmath
import cmath
print(cmath.polar(5+12j)) # ได้ (13.0, 1.176005207095135)

จะได้ทูเพิลที่มีสมาชิกตัวแรกเป็น r และตัวหลังเป็น θ โดยหน่วยมุมในที่นี้เป็นเรเดียน

ภาพแสดงจำนวนเชิงซ้อนในระบบพิกัดเชิงขั้ว (วาดโดย matplotlib)



นอกจากนั้นเราอาจหาค่า r ด้วยฟังก์ชัน abs ซึ่งเป็นฟังก์ชันมาตรฐานก็ได้
print(abs(5+12j)) # ได้ 13.0

ส่วน θ หาได้ด้วยฟังก์ชัน phase ใน cmath
print(cmath.phase(5+12j)) # ได้ 1.1760052071

และในทางกลับกันสามารถแปลงค่าที่เป็นพิกัดเชิงขั้วกลับเป็นรูป x+yi ได้ด้วยฟังก์ชัน rect ใน cmath
print(cmath.rect(13,1.176005271)) # ได้ (4.99999923314+12.0000003195j)



ฟังก์ชันอื่นๆใน cmath
มอดูล cmath นั้นประกอบไปด้วยฟังก์ชันที่เหมือนกันกับในมอดูล math มากมาย เช่น exp, log, sqrt, sin, asin, sinh เป็นต้น

ฟังก์ชันเหล่านี้สามารถทำงานได้เหมือนกับใน math เพียงแต่ว่าจะให้ผลลัพธ์เป็นข้อมูลชนิดจำนวนเชิงซ้อนเสมอ แม้ว่าจะไม่มีส่วนจินตภาพเกิดขึ้นเลยก็ตาม
print(math.sin(1.3)) # ได้ 0.9974949866040544
print(cmath.sin(1.3)) # ได้ (0.9974949866040544+0j)

ฟังก์ชันใน math นั้นโดยทั่วไปไม่สามารถใช้กับจำนวนเชิงซ้อนได้ หรือแม้แต่ฟังก์ชันที่ใช้จำนวนจริงแต่ควรให้ผลเป็นจำนวนเชิงซ้อนก็จะเกิดข้อ ผิดพลาด

เช่นฟังก์ชัน sqrt นั้นถ้าเป็นของ math จะไม่สามารถถอดรากจำนวนลบได้ ในขณะที่ใน cmath จะถอดรากแล้วได้จำนวนเชิงซ้อน
print(math.sqrt(-3)) # ได้ ValueError: math domain error
print(cmath.sqrt(-3)) # ได้ 1.7320508075688772j



อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文