จำนวนเชิงซ้อน เป็นชนิดข้อมูลชนิดหนึ่งในภาษาไพธอน และมีลักษณะพิเศษที่มากกว่าจำนวนจริง จึงน่านำมากล่าวถึงแยกต่างหากเป็นพิเศษสักหน่อย
numpy มีคำสั่งต่างๆที่ช่วยในการจัดการกับจำนวนเชิงซ้อนภายในอาเรย์ทำให้การใช้งานทำได้สะดวก ซึ่งจะมาพูดถึงกันตรงนี้
สำหรับการจัดการกับจำนวนเชิงซ้อนในเบื้องต้นของภาษาไพธอนที่ไม่เกี่ยวกับ numpy อ่านได้ที่
https://phyblas.hinaboshi.com/20160608 การสร้างอาเรย์ของจำนวนเชิงซ้อน ตอนที่ประกาศสร้างอาเรย์ขึ้นมาจากลิสต์หากมีสมาชิกเป็นจำนวนเชิงซ้อนแม้แต่ตัว เดียวก็จะได้ชนิดของอาเรย์เป็นจำนวนเชิงซ้อน สมาชิกตัวอื่นทั้งหมดก็จะเขียนอยู่ในรูปจำนวนเชิงซ้อนด้วย
import numpy as np
az = np.array([ 2, 1, 2+1j])
print(az) # ได้ [ 2.+0.j 1.+0.j 2.+1.j]
print(az.dtype) # ได้ dtype('complex128')
complex128 ในที่นี้เป็นชนิดข้อมูลจำนวนเชิงซ้อนมาตรฐานเมื่อสร้างจำนวนเชิงซ้อนขึ้นมา แล้วไม่กำหนดอะไรเพิ่มเติมก็จะได้ชนิดนี้ นอกจากนี้ยังมี complex64 กับ complex256 ด้วย สามารถกำหนดได้ตอนสร้าง
หรือหากสมาชิกเป็นจำนวนจริงแต่ระบุชนิดเป็นจำนวนเชิงซ้อนก็จะได้อาเรย์ของจำนวนเชิงซ้อนเช่นกัน
ay = np.array([3,4,5],dtype=complex)
print(ay) # ได้ [ 3.+0.j 4.+0.j 5.+0.j]
print(ay.dtype) # ได้ dtype('complex128')
หากระบุว่า complex เฉยๆจะได้ชนิด complex128 แต่ถ้าต้องการชนิด 'complex64' หรือ 'complex256' ก็ต้องระบุไปเป็นสายอักขระ
ay = np.array([3,4,5],dtype='complex64')
อาเรย์ของจำนวนจริงหากนำมาบวกกับจำนวนเชิงซ้อนก็จะเปลี่ยนได้ผลเป็น จำนวนเชิงซ้อนทันที จะใช้วิธีนี้ในการสร้างอาเรย์จำนวนเชิงซ้อนก็ได้
print(np.arange(1,8)+0j) # [ 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j 7.+0.j]
เมื่ออาเรย์จำนวนจริงคูณกับจำนวนเชิงซ้อน ก็จะได้อาเรย์จำนวนเชิงซ้อนมา
print(np.arange(5)*1j) # ได้ [ 0.+0.j 0.+1.j 0.+2.j 0.+3.j 0.+4.j]
ดังนั้นอาจสร้างอาเรย์ของจำนวนเชิงซ้อนได้โดยการสร้างส่วนจริงและส่วนจินตภาพแยกกันแล้วนำมาบวกกันได้
az = np.arange(1,8)*3+np.arange(1,8)*4j
print(az) # ได้ [ 3. +4.j 6. +8.j 9.+12.j 12.+16.j 15.+20.j 18.+24.j 21.+28.j]
ต้องระวังว่าอาเรย์ของจำนวนจริงต่อให้นำมาคำนวณยังไงก็ไม่อาจได้จำนวนเชิงซ้อน เช่นต่อให้รู้ว่าจำนวนติดลบยกกำลังแล้วควรจะได้จำนวนเชิงซ้อนก็ตาม
ayy = np.arange(-3,2)
print(ayy) # ได้ [-3 -2 -1 0 1]
print(ayy**0.5) # ได้ [ nan nan nan 0. 1.]
ลักษณะแบบนี้ไม่ว่าจะทำในไพธอน 3 หรือ 2 ก็ให้ผลแบบเดียวกัน
ดังนั้นจึงมีความจำเป็นต้องเปลี่ยนให้อยู่ในรูปเชิงซ้อนก่อน
print((ayy+0j)**0.5) # ได้ [ 0.+1.73205081j 0.+1.41421356j 0.+1.j 0.+0.j 1.+0.j ]
ส่วนจริง, ส่วนจินตภาพ และสังยุค ในการหาค่าส่วนจริงและส่วนจินตภาพของจำนวนเชิงซ้อนในอาเรย์อาจใช้ฟังก์ชัน np.real และ np.imag หรืออาจจะดูค่าเป็นแอตทริบิวต์ real และ imag ก็ได้เช่นกัน
ayz = np.arange(3,9)+np.arange(1,7)*1j
print(np.real(ayz)) # ได้ [ 3. 4. 5. 6. 7. 8.]
print(np.imag(ayz)) # ได้ [ 1. 2. 3. 4. 5. 6.]
print(ayz.real) # ได้ [ 3. 4. 5. 6. 7. 8.]
print(ayz.imag) # ได้ [ 1. 2. 3. 4. 5. 6.]
ส่วนค่าสังยุคหาได้จาก ฟังก์ชัน np.conj หรืออาจใช้เมธอด conj ก็ได้ (เป็นเมธอด ไม่ใช่แอตทริบิวต์ ต้องมีวงเล็บด้วย)
print(ayz.conj()) # ได้ [ 3.-1.j 4.-2.j 5.-3.j 6.-4.j 7.-5.j 8.-6.j]
print(np.conj(ayz)) # ได้ [ 3.-1.j 4.-2.j 5.-3.j 6.-4.j 7.-5.j 8.-6.j]
จำนวนเชิงซ้อนในรูปพิกัดเชิงขั้ว จำนวนเชิงซ้อนอาจเขียนในรูปแบบเชิงขั้ว แสดงโดยค่าสัมบูรณ์ r และมุมเฟส θ ดังนี้
ค่าสัมบูรณ์หาได้โดยใช้ฟังก์ชัน np.abs หรือ np.absolute (ความจริงแล้วคือฟังก์ชันเดียวกัน np.abs เป็นแค่ชื่อย่อของ np.absolute)
azz = np.arange(-2,3)+np.arange(1,6)*2j
print(azz) # ได้ [-2. +2.j -1. +4.j 0. +6.j 1. +8.j 2.+10.j]
print(np.abs(azz)) # ได้ [ 2.82842712 4.12310563 6. 8.06225775 10.19803903]
และมุมเฟสหาได้จากฟังก์ชัน np.angle
print(np.angle(azz)) # ได้ [ 2.35619449 1.81577499 1.57079633 1.44644133 1.37340077]
ลองนำมาวาดกราฟของแต่ละจุดโดยให้เส้นลากจากจุด 0 โดยให้แกนนอนเป็นส่วนจริงและแกนตั้งเป็นส่วนจินตภาพ
import matplotlib.pyplot as plt
plt.axes(xlim=[-7,8],ylim=[0,10])
for i in range(len(azz)):
plt.plot([0,azz[i].real],[0,azz[i].imag])
plt.show()
ลองเขียนในรูปพิกัดเชิงขั้วโดยใช้ค่าสัมบูรณ์และมุมเฟส
plt.axes(polar=1)
for i in range(len(azz)):
plt.plot([0,np.angle(azz[i])],[0,np.abs(azz[i])])
plt.show()
จะเห็นว่าได้กราฟออกมาเหมือนกัน
อ้างอิง