Trừ hai số phức trong Python bằng lớp

Hầu hết các ngôn ngữ lập trình có mục đích chung đều không hỗ trợ hoặc hỗ trợ hạn chế cho các số phức. Các tùy chọn điển hình của bạn là học một số công cụ chuyên dụng như MATLAB hoặc tìm thư viện của bên thứ ba. Python là một ngoại lệ hiếm hoi vì nó đi kèm với các số phức được tích hợp sẵn

Mặc dù tên, số phức không phức tạp. Chúng thuận tiện trong việc giải quyết các vấn đề thực tế mà bạn sẽ cảm nhận được trong hướng dẫn này. Bạn sẽ khám phá đồ họa vector và phân tích tần số âm thanh, nhưng các số phức cũng có thể giúp vẽ các fractal, chẳng hạn như tập hợp Mandelbrot

Trong hướng dẫn này, bạn sẽ học cách

  • Xác định số phức bằng chữ trong Python
  • Biểu diễn các số phức trong hệ tọa độ vuông góc và cực
  • Sử dụng số phức trong biểu thức số học
  • Tận dụng mô-đun
    >>> z = 3.14 + 0j
    >>> type(z)
    <class 'complex'>
    
    9 tích hợp
  • Dịch các công thức toán học trực tiếp sang mã Python

Nếu bạn cần xem lại nhanh hoặc giới thiệu nhẹ nhàng về lý thuyết số phức, thì bạn có thể xem loạt video của Khan Academy. Để tải xuống mã mẫu được sử dụng trong hướng dẫn này, hãy nhấp vào liên kết bên dưới

Nhận mã mẫu. Nhấp vào đây để lấy mã mẫu mà bạn sẽ sử dụng để tìm hiểu về số phức trong Python trong hướng dẫn này

Tạo số phức trong Python

Tạo và thao tác với các số phức trong Python không khác nhiều so với các kiểu dữ liệu dựng sẵn khác, đặc biệt là các kiểu số. Có thể vì ngôn ngữ coi họ là công dân hạng nhất. Điều này có nghĩa là bạn có thể diễn đạt các công thức toán học liên quan đến các số phức với ít chi phí

Python cho phép bạn sử dụng các số phức trong các biểu thức số học và gọi các hàm trên chúng giống như cách bạn làm với các số khác trong Python. Nó dẫn đến cú pháp tao nhã gần giống như một cuốn sách giáo khoa toán học

Loại bỏ các quảng cáo

Số Phức Chữ

Cách nhanh nhất để xác định một số phức trong Python là gõ trực tiếp chữ của nó vào mã nguồn

>>>

>>> z = 3 + 2j

Mặc dù điều này trông giống như một công thức đại số, nhưng biểu thức ở bên phải của dấu bằng đã là một giá trị cố định không cần đánh giá thêm. Khi bạn kiểm tra loại của nó, bạn sẽ xác nhận rằng đó thực sự là một số phức

>>>

>>> type(z)
<class 'complex'>

Điều đó khác với phép cộng hai số bằng toán tử cộng như thế nào? . Nếu bạn xóa chữ cái, thay vào đó, bạn sẽ nhận được kết quả số nguyên quen thuộc

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>

Nhân tiện, bạn cũng có thể sử dụng số dấu phẩy động để tạo số phức

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>

Chữ số phức trong Python bắt chước ký hiệu toán học, còn được gọi là dạng chuẩn, dạng đại số hoặc đôi khi là dạng chính tắc của một số phức. Trong Python, bạn có thể sử dụng chữ thường

>>> 2 + 3j + 4 + 5j
(6+8j)
0 hoặc chữ hoa
>>> 2 + 3j + 4 + 5j
(6+8j)
2 trong những chữ đó

Nếu bạn đã học về số phức trong lớp toán, bạn có thể đã thấy chúng được diễn đạt bằng cách sử dụng

>>> 2 + 3j + 4 + 5j
(6+8j)
3 thay vì
>>> 2 + 3j + 4 + 5j
(6+8j)
0. Nếu bạn tò mò về lý do Python sử dụng
>>> 2 + 3j + 4 + 5j
(6+8j)
0 thay vì
>>> 2 + 3j + 4 + 5j
(6+8j)
3, thì bạn có thể mở rộng phần có thể thu gọn bên dưới để tìm hiểu thêm

Tại sao lại là

>>> 2 + 3j + 4 + 5j
(6+8j)
0 thay vì
>>> 2 + 3j + 4 + 5j
(6+8j)
3?Hiển thị/Ẩn

Ký hiệu truyền thống cho các số phức sử dụng chữ cái

>>> 2 + 3j + 4 + 5j
(6+8j)
3 thay vì
>>> 2 + 3j + 4 + 5j
(6+8j)
0 vì nó là viết tắt của đơn vị ảo. Bạn có thể cảm thấy hơi khó chịu với quy ước của Python nếu bạn có nền tảng toán học. Tuy nhiên, có một vài lý do có thể biện minh cho sự lựa chọn gây tranh cãi của Python

  • Đó là một quy ước đã được các kỹ sư áp dụng để tránh xung đột tên với dòng điện, được ký hiệu bằng chữ cái
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    3
  • Trong tin học, chữ cái
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    3 thường được sử dụng cho biến chỉ mục trong các vòng lặp
  • Chữ cái
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    3 có thể dễ bị nhầm lẫn với
    >>> type(z)
    <class 'complex'>
    
    04 hoặc
    >>> type(z)
    <class 'complex'>
    
    05 trong mã nguồn

Điều này đã được đưa ra trên trình theo dõi lỗi của Python hơn một thập kỷ trước và chính người tạo ra Python, Guido van Rossum, đã đóng vấn đề bằng nhận xét này

Điều này sẽ không được sửa chữa. Đối với một điều, chữ 'i' hoặc chữ hoa 'I' trông quá giống các chữ số. Cách các số được phân tích cú pháp bằng trình phân tích cú pháp ngôn ngữ (trong mã nguồn) hoặc bằng các hàm dựng sẵn (int, float, complex) không được bản địa hóa hoặc có thể định cấu hình theo bất kỳ cách nào; . Nếu bạn muốn phân tích các số phức bằng cách sử dụng 'i' thay vì 'j', bạn đã có sẵn rất nhiều giải pháp. ()

Vì vậy, có bạn có nó. Trừ khi bạn muốn bắt đầu sử dụng MATLAB, nếu không bạn sẽ phải quen với việc sử dụng

>>> 2 + 3j + 4 + 5j
(6+8j)
0 để biểu thị các số phức của mình

Dạng đại số của số phức tuân theo các quy tắc chuẩn của đại số, thuận tiện khi thực hiện các phép tính số học. Ví dụ, phép cộng có thuộc tính giao hoán, cho phép bạn hoán đổi thứ tự của hai phần của một số phức bằng chữ mà không làm thay đổi giá trị của nó

>>>

>>> 3 + 2j == 2j + 3
True

Tương tự, bạn có thể thay thế phép cộng bằng phép trừ trong một số phức bằng chữ vì dấu trừ chỉ là ký hiệu viết tắt cho một dạng tương đương

>>>

>>> 3 - 2j == 3 + (-2j)
True

Có phải một số phức bằng chữ trong Python luôn phải bao gồm hai số không? . Không có gì đáng ngạc nhiên, nếu bạn chỉ chỉ định một số, không có chữ cái

>>> 2 + 3j + 4 + 5j
(6+8j)
0, thì bạn sẽ nhận được một số nguyên thông thường hoặc một số có dấu phẩy động

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>

Mặt khác, thêm chữ cái

>>> 2 + 3j + 4 + 5j
(6+8j)
0 vào một chữ số sẽ ngay lập tức biến nó thành một số phức

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>

Nói một cách chính xác, từ quan điểm toán học, bạn vừa tạo một số ảo thuần túy, nhưng Python không thể biểu diễn nó dưới dạng một kiểu dữ liệu độc lập. Do đó, không có phần còn lại, nó chỉ là một số phức

Còn ngược lại thì sao?

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>

Thật vậy, cả hai phần của số phức luôn có. Khi bạn không nhìn thấy một, điều đó có nghĩa là nó có giá trị bằng không. Hãy kiểm tra xem điều gì sẽ xảy ra khi bạn cố gắng thêm nhiều số hạng vào tổng hơn trước đây

>>>

>>> 2 + 3j + 4 + 5j
(6+8j)

Lần này, biểu thức của bạn không còn là chữ vì Python đã đánh giá nó thành một số phức chỉ bao gồm hai phần. Hãy nhớ rằng các quy tắc cơ bản của đại số áp dụng cho các số phức, vì vậy nếu bạn nhóm các số hạng tương tự và áp dụng phép cộng thành phần, thì bạn sẽ có kết quả là

>>> type(z)
<class 'complex'>
09

Lưu ý cách Python hiển thị các số phức theo mặc định. Biểu diễn văn bản của chúng chứa một cặp dấu ngoặc đơn kèm theo, một chữ cái viết thường

>>> 2 + 3j + 4 + 5j
(6+8j)
0 và không có khoảng trắng. Ngoài ra, phần tưởng tượng đến thứ hai

Các số phức cũng là số ảo thuần túy xuất hiện mà không có dấu ngoặc đơn và chỉ tiết lộ phần ảo của chúng

>>>

>>> type(z)
<class 'complex'>
0

Điều này giúp phân biệt các số ảo với hầu hết các số phức được tạo thành từ phần thực và phần ảo

Loại bỏ các quảng cáo

>>> type(z) <class 'complex'> 11 Chức năng của nhà máy

Python có một hàm tích hợp,

>>> type(z)
<class 'complex'>
11, mà bạn có thể sử dụng thay thế cho chữ số phức

>>>

>>> type(z)
<class 'complex'>
1

Ở dạng này, nó giống như một bộ hoặc một cặp số thông thường được sắp xếp theo thứ tự. Sự tương tự không quá xa vời. Các số phức có cách diễn giải hình học trong hệ tọa độ Descartes mà bạn sẽ khám phá sau. Bạn có thể coi số phức là hai chiều

Sự thật thú vị. Trong toán học, các số phức thường được biểu thị bằng chữ cái

>>> type(z)
<class 'complex'>
13 vì đây là chữ cái tiếp theo trong bảng chữ cái sau
>>> type(z)
<class 'complex'>
14 và
>>> type(z)
<class 'complex'>
15, thường biểu thị tọa độ

Hàm nhà máy số phức chấp nhận hai tham số số. Cái đầu tiên đại diện cho phần thực, trong khi cái thứ hai đại diện cho phần ảo được ký hiệu bằng chữ cái

>>> 2 + 3j + 4 + 5j
(6+8j)
0 trong chữ mà bạn đã thấy trước đó

>>>

>>> type(z)
<class 'complex'>
2

Cả hai tham số đều là tùy chọn, với các giá trị mặc định bằng 0, giúp việc xác định các số phức không có phần ảo hoặc cả phần thực và phần ảo trở nên dễ dàng hơn

>>>

>>> type(z)
<class 'complex'>
3

Phiên bản một đối số có thể hữu ích trong việc truyền kiểu. Ví dụ: bạn có thể truyền một giá trị không phải là số như một chuỗi ký tự để nhận đối tượng

>>> type(z)
<class 'complex'>
17 tương ứng. Tuy nhiên, lưu ý rằng chuỗi không được chứa bất kỳ khoảng trắng nào

>>>

>>> type(z)
<class 'complex'>
4

Sau này, bạn sẽ tìm hiểu cách làm cho các lớp của mình tương thích với cơ chế truyền kiểu này. Thật thú vị, khi bạn chuyển một số phức cho

>>> type(z)
<class 'complex'>
11, bạn sẽ nhận lại được số phức tương tự

>>>

>>> type(z)
<class 'complex'>
5

Điều đó phù hợp với cách thức hoạt động của các loại số khác trong Python vì tất cả chúng đều không thay đổi. Để tạo một bản sao khác biệt của một số phức, bạn phải gọi lại hàm có cả hai đối số hoặc khai báo một biến khác có chữ số phức

>>>

>>> type(z)
<class 'complex'>
6

Khi bạn cung cấp hai đối số cho hàm, chúng phải luôn là số, chẳng hạn như

>>> type(z)
<class 'complex'>
19,
>>> type(z)
<class 'complex'>
20 hoặc
>>> type(z)
<class 'complex'>
17. Nếu không, bạn sẽ gặp lỗi thời gian chạy. Về mặt kỹ thuật,
>>> type(z)
<class 'complex'>
22 là một lớp con của
>>> type(z)
<class 'complex'>
19, vì vậy nó cũng sẽ hoạt động

>>>

>>> type(z)
<class 'complex'>
7

Mọi thứ dường như trở nên kỳ lạ hơn khi bạn cung cấp hàm xuất xưởng

>>> type(z)
<class 'complex'>
11 với các số phức làm đối số. Tuy nhiên, nếu bạn chỉ cung cấp đối số đầu tiên, nó sẽ hoạt động giống như một proxy như trước đây

>>>

>>> type(z)
<class 'complex'>
8

Tuy nhiên, khi có hai đối số và ít nhất một trong số chúng là số phức, bạn sẽ nhận được kết quả có thể khó giải thích ngay từ cái nhìn đầu tiên

>>>

>>> type(z)
<class 'complex'>
9

Để có câu trả lời, chúng ta hãy xem qua chuỗi tài liệu của chức năng nhà máy hoặc tài liệu trực tuyến, giải thích điều gì đang diễn ra khi bạn gọi

>>> type(z)
<class 'complex'>
25

Trả về một số phức với giá trị thực + hình ảnh*1j hoặc chuyển đổi một chuỗi hoặc số thành một số phức. ()

Trong phần giải thích này,

>>> type(z)
<class 'complex'>
26 và
>>> type(z)
<class 'complex'>
27 là tên của các đối số hàm. Đối số thứ hai được nhân với đơn vị ảo
>>> 2 + 3j + 4 + 5j
(6+8j)
0 và kết quả được thêm vào đối số đầu tiên. Đừng lo lắng nếu nó vẫn không có ý nghĩa gì. Bạn có thể quay lại phần này khi bạn đã đọc về. Các quy tắc mà bạn sẽ tìm hiểu sẽ làm cho điều này trở nên đơn giản

Khi nào bạn muốn sử dụng hàm nhà máy

>>> type(z)
<class 'complex'>
11 theo nghĩa đen?

Loại bỏ các quảng cáo

Làm quen với số phức Python

Trong toán học, số phức là tập hợp siêu của các số thực, nghĩa là mọi số thực cũng là số phức có phần ảo bằng 0. Python mô hình hóa mối quan hệ này thông qua một khái niệm gọi là tháp số, được mô tả trong PEP 3141

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
0

Mô-đun

>>> type(z)
<class 'complex'>
30 tích hợp xác định hệ thống phân cấp các loại số thông qua các lớp trừu tượng có thể được sử dụng để kiểm tra loại và phân loại số. Ví dụ: để xác định xem một giá trị có thuộc về một bộ số cụ thể hay không, bạn có thể gọi _____________31 trên đó

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
1

Giá trị dấu phẩy động

>>> type(z)
<class 'complex'>
32 là một số thực cũng là một số phức nhưng không phải là một số nguyên. Lưu ý rằng bạn không thể sử dụng các loại tích hợp trực tiếp trong thử nghiệm như vậy

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
2

Sự khác biệt giữa

>>> type(z)
<class 'complex'>
17 và
>>> type(z)
<class 'complex'>
34 là chúng thuộc về các nhánh riêng biệt trong cây phân cấp kiểu số và cái sau là lớp cơ sở trừu tượng không có bất kỳ triển khai nào

Trừ hai số phức trong Python bằng lớp
Nhập phân cấp cho các số trong Python

Các lớp cơ sở trừu tượng, được biểu thị bằng màu đỏ trong sơ đồ trên, có thể bỏ qua cơ chế kiểm tra kế thừa thông thường bởi các lớp không liên quan như các lớp con ảo của chúng. Đó là lý do tại sao một giá trị dấu chấm động trong ví dụ dường như là một thể hiện của

>>> type(z)
<class 'complex'>
34 nhưng không phải là
>>> type(z)
<class 'complex'>
17

Truy cập phần thực và phần ảo

Để lấy phần thực và phần ảo của một số phức trong Python, bạn có thể sử dụng các thuộc tính

>>> type(z)
<class 'complex'>
37 và
>>> type(z)
<class 'complex'>
38 tương ứng

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
3

Cả hai thuộc tính đều ở dạng chỉ đọc vì số phức là bất biến, do đó, việc cố gắng gán một giá trị mới cho một trong số chúng sẽ không thành công

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
4

Vì mỗi số trong Python là một kiểu cụ thể hơn của số phức, nên các thuộc tính và phương thức được định nghĩa trong

>>> type(z)
<class 'complex'>
34 cũng có sẵn trong tất cả các kiểu số, bao gồm
>>> type(z)
<class 'complex'>
19 và
>>> type(z)
<class 'complex'>
20

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
5

Phần ảo của những con số như vậy luôn bằng không

Tính liên hợp của một số phức

Số phức Python chỉ có ba thành viên công khai. Ngoài các thuộc tính

>>> type(z)
<class 'complex'>
37 và
>>> type(z)
<class 'complex'>
38, chúng đưa ra phương thức
>>> type(z)
<class 'complex'>
44, lật dấu của phần ảo

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
6

Đối với những số có phần ảo bằng 0, nó sẽ không có tác dụng gì

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
7

Hoạt động này là nghịch đảo của chính nó, vì vậy gọi nó hai lần sẽ giúp bạn có được số ban đầu mà bạn đã bắt đầu

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
8

Mặc dù có vẻ ít giá trị, nhưng liên hợp phức có một số tính chất số học hữu ích có thể giúp tính toán phép chia hai số phức bằng bút và giấy, trong số nhiều thứ khác

Loại bỏ các quảng cáo

Số phức Số học

>>> type(z)
<class 'complex'>
17 là một kiểu dữ liệu gốc trong Python, nên bạn có thể cắm các số phức vào các biểu thức số học và gọi nhiều hàm tích hợp trên chúng. Các hàm nâng cao hơn cho số phức được định nghĩa trong mô-đun
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9, là một phần của thư viện chuẩn. Bạn sẽ được giới thiệu về nó trong phần sau của hướng dẫn này

Hiện tại, việc ghi nhớ một quy tắc duy nhất sẽ cho phép bạn áp dụng kiến ​​thức số học ở trường tiểu học để tính các phép tính cơ bản liên quan đến số phức. Quy tắc cần nhớ là định nghĩa của đơn vị ảo, thỏa mãn phương trình sau

Trừ hai số phức trong Python bằng lớp

Có vẻ không đúng khi bạn coi

>>> 2 + 3j + 4 + 5j
(6+8j)
0 là một số thực, nhưng đừng hoảng sợ. Nếu bạn bỏ qua nó trong giây lát và thay thế mọi lần xuất hiện của
>>> 2 + 3j + 4 + 5j
(6+8j)
0_______2_______49 bằng
>>> type(z)
<class 'complex'>
50 như thể nó là một hằng số, thì bạn sẽ bị đặt. Hãy xem nó hoạt động như thế nào

Phép cộng

Tổng của hai hoặc nhiều số phức tương đương với việc cộng các phần thực và phần ảo của chúng theo từng thành phần

>>>

>>> z = 3 + 2

>>> type(z)
<class 'int'>
9

Trước đó, bạn đã biết rằng các biểu thức đại số bao gồm các số thực và số ảo tuân theo các quy tắc chuẩn của đại số. Khi bạn viết nó ra dưới dạng đại số, bạn sẽ có thể áp dụng thuộc tính phân phối và đơn giản hóa công thức bằng cách loại bỏ và nhóm các thuật ngữ phổ biến

Trừ hai số phức trong Python bằng lớp

Python tự động thăng cấp toán hạng thành kiểu dữ liệu

>>> type(z)
<class 'complex'>
17 khi bạn thêm giá trị của các kiểu số hỗn hợp

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
0

Điều đó tương tự với việc chuyển đổi ngầm định từ

>>> type(z)
<class 'complex'>
19 sang
>>> type(z)
<class 'complex'>
20 mà bạn có thể quen thuộc hơn

phép trừ

Trừ các số phức cũng tương tự như cộng chúng, có nghĩa là bạn cũng có thể áp dụng nó theo từng phần tử

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
1

Tuy nhiên, không giống như tổng, thứ tự của các toán hạng là quan trọng và mang lại các kết quả khác giống như với số thực

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
2

Bạn cũng có thể sử dụng toán tử trừ một ngôi (-) để tạo thành số âm của một số phức

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
3

Điều này đảo ngược cả phần thực và phần ảo của số phức

Loại bỏ các quảng cáo

Phép nhân

Tích của hai hay nhiều số phức trở nên thú vị hơn

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
4

Làm thế quái nào mà bạn lại kết thúc với một số âm trong số những số dương duy nhất?

Trừ hai số phức trong Python bằng lớp

Quan sát quan trọng cần thực hiện là

>>> 2 + 3j + 4 + 5j
(6+8j)
0 lần ____3_______0 cho ____3_______0_______2_______49, có thể được thay thế bằng ____2_______50. Điều này đảo ngược dấu hiệu của một trong các triệu hồi, trong khi phần còn lại của các quy tắc vẫn giống hệt như trước đây

Phân công

Việc chia các số phức có thể trông đáng sợ ngay từ lần gặp đầu tiên

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
5

Dù bạn có tin hay không thì tùy, bạn có thể đạt được kết quả tương tự chỉ bằng bút và giấy. (Được rồi, một máy tính có thể giúp bạn bớt đau đầu. ) Khi cả hai số được biểu thị ở dạng chuẩn của chúng, mẹo là nhân tử số và mẫu số với liên hợp của mẫu số

Trừ hai số phức trong Python bằng lớp

Mẫu số trở thành môđun bình phương của số chia. Bạn sẽ tìm hiểu thêm về mô đun của số phức sau. Khi bạn tiếp tục rút ra công thức, đây là những gì bạn sẽ nhận được

Trừ hai số phức trong Python bằng lớp

Lưu ý rằng số phức không hỗ trợ, còn được gọi là phép chia số nguyên

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
6

Cái này từng hoạt động trong Python 2. x nhưng sau đó đã bị xóa để tránh sự mơ hồ

lũy thừa

Bạn có thể nâng số phức lên lũy thừa bằng cách sử dụng toán tử lũy thừa nhị phân (

>>> type(z)
<class 'complex'>
59) hoặc tích hợp sẵn
>>> type(z)
<class 'complex'>
60 nhưng không phải là toán tử được xác định trong mô-đun
>>> type(z)
<class 'complex'>
61, vốn chỉ hỗ trợ các giá trị dấu phẩy động

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
7

Cả cơ số và số mũ đều có thể thuộc bất kỳ loại số nào, bao gồm số nguyên, dấu phẩy động, ảo hoặc phức

>>>

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
8

Luỹ thừa thủ công các số phức trở nên rất khó khăn khi chúng được biểu thị ở dạng chuẩn. Sẽ thuận tiện hơn nhiều khi viết lại số ở dạng lượng giác và tính lũy thừa bằng một số lượng giác cơ bản. Nếu bạn quan tâm đến toán học liên quan, hãy xem công thức của De Moivre, cho phép bạn làm điều đó

Loại bỏ các quảng cáo

Sử dụng số phức Python làm vectơ 2D

Bạn có thể hình dung các số phức dưới dạng điểm hoặc vectơ trên mặt phẳng Euclide trong hệ tọa độ Cartesian hoặc hình chữ nhật

Trừ hai số phức trong Python bằng lớp

Trục X trên mặt phẳng phức, còn được gọi là mặt phẳng Gauss hoặc sơ đồ Argand, biểu thị phần thực của một số phức, trong khi trục Y biểu thị phần ảo của nó

Thực tế này dẫn đến một trong những tính năng thú vị nhất của kiểu dữ liệu

>>> type(z)
<class 'complex'>
17 trong Python, thể hiện việc triển khai sơ bộ một vectơ hai chiều miễn phí. Mặc dù không phải tất cả các hoạt động đều hoạt động theo cùng một cách trong cả hai, nhưng vectơ và số phức có nhiều điểm tương đồng

Lấy tọa độ

Tam giác quỷ Bermuda là một khu vực huyền thoại được biết đến với những hiện tượng huyền bí trải dài qua mũi phía nam của Florida, Puerto Rico và hòn đảo nhỏ Bermuda. Các đỉnh của nó được xác định xấp xỉ bởi ba thành phố lớn có tọa độ địa lý như sau

  1. miami. 25° 45’ 42. 054” N, 80° 11’ 30. 438” W
  2. San Juan. 18° 27’ 58. 8” N, 66° 6’ 20. 598” W
  3. Hamilton. 32° 17’ 41. 64” Bắc, 64° 46’ 58. 908” W

Sau khi chuyển đổi các tọa độ này thành độ thập phân, bạn sẽ có hai số dấu phẩy động cho mỗi thành phố. Bạn có thể sử dụng kiểu dữ liệu

>>> type(z)
<class 'complex'>
17 để lưu trữ các cặp số theo thứ tự. Vì vĩ độ là tọa độ dọc và kinh độ là tọa độ nằm ngang, nên có thể thuận tiện hơn khi chuyển đổi chúng xung quanh để tuân theo thứ tự truyền thống của tọa độ Descartes

>>> z = 3.14 + 2.71j
>>> type(z)
<class 'complex'>
9

Các giá trị kinh độ âm đại diện cho bán cầu tây, trong khi các giá trị vĩ độ dương đại diện cho bán cầu bắc

Hãy nhớ rằng đây là các tọa độ hình cầu. Để chiếu chính xác chúng lên một mặt phẳng, bạn cần tính đến độ cong của Trái đất. Một trong những phép chiếu bản đồ đầu tiên được sử dụng trong bản đồ học là phép chiếu Mercator, giúp các thủy thủ điều hướng tàu của họ. Nhưng hãy bỏ qua tất cả những điều đó và giả sử rằng các giá trị đã được biểu thị trong hệ tọa độ hình chữ nhật

Khi bạn vẽ các con số trên một mặt phẳng phức tạp, bạn sẽ nhận được một mô tả sơ bộ về Tam giác quỷ Bermuda

Trừ hai số phức trong Python bằng lớp

Trong các tài liệu đi kèm, bạn sẽ tìm thấy Sổ tay Jupyter tương tác vẽ sơ đồ Tam giác Bermuda bằng thư viện Matplotlib. Để tải mã nguồn và tài liệu cho hướng dẫn này, hãy nhấp vào liên kết bên dưới

Nhận mã mẫu. Nhấp vào đây để lấy mã mẫu mà bạn sẽ sử dụng để tìm hiểu về số phức trong Python trong hướng dẫn này

Nếu bạn không thích gọi hàm xuất xưởng

>>> type(z)
<class 'complex'>
11, bạn có thể tạo một cái tên phù hợp hơn hoặc sử dụng dạng chữ của một số phức để tiết kiệm một vài lần nhấn phím

>>> 3 + 2j == 2j + 3
True
0

Nếu bạn cần đóng gói nhiều thuộc tính hơn cho một thành phố, bạn có thể sử dụng một bộ có tên hoặc một lớp dữ liệu hoặc tạo một lớp tùy chỉnh

Tính độ lớn

Độ lớn, còn được gọi là mô đun hoặc bán kính của một số phức, là độ dài của vectơ mô tả nó trên một mặt phẳng phức

Trừ hai số phức trong Python bằng lớp

Bạn có thể tính nó từ định lý Pytago bằng cách lấy căn bậc hai của tổng bình phương phần thực và bình phương phần ảo

Trừ hai số phức trong Python bằng lớp

Bạn sẽ nghĩ rằng Python sẽ cho phép bạn tính toán độ dài của một vectơ như vậy bằng công cụ tích hợp sẵn

>>> type(z)
<class 'complex'>
65, nhưng thực tế không phải vậy. Để lấy độ lớn của một số phức, bạn phải gọi một hàm toàn cục khác có tên , hàm này thường được sử dụng để tính giá trị tuyệt đối của một số

>>>

>>> 3 + 2j == 2j + 3
True
1

Hàm này xóa dấu khỏi các số nguyên mà bạn nhập vào, nhưng đối với các số phức, hàm này trả về độ lớn hoặc độ dài vectơ

>>>

>>> 3 + 2j == 2j + 3
True
2

Bạn có thể nhớ từ phần trước rằng một số phức nhân với liên hợp của nó sẽ tạo ra bình phương độ lớn của nó.

Loại bỏ các quảng cáo

Tìm Khoảng Cách Giữa Hai Điểm

Hãy tìm tâm hình học của Tam giác quỷ Bermuda và khoảng cách đến nó từ ba thành phố tạo nên ranh giới của nó. Trước tiên, bạn cần tính tổng tất cả các tọa độ và chia kết quả cho số lượng của chúng để lấy giá trị trung bình

>>> 3 + 2j == 2j + 3
True
3

Điều này sẽ cung cấp cho bạn một điểm nằm ở Đại Tây Dương, một nơi nào đó trong tam giác

Trừ hai số phức trong Python bằng lớp

Giờ đây, bạn có thể tạo các vectơ neo tại các thành phố và hướng về tâm hình học của tam giác. Các vectơ được tạo bằng cách trừ nguồn khỏi điểm đích

>>> 3 + 2j == 2j + 3
True
4

Vì bạn trừ các số phức, mọi vectơ cũng là một số phức gồm hai phần. Để có được khoảng cách của bạn, hãy tính độ lớn của từng vectơ

>>>

>>> 3 + 2j == 2j + 3
True
5

Độ dài vectơ này không phản ánh khoảng cách có ý nghĩa nhưng là giá trị gần đúng cho một ví dụ về đồ chơi như thế này. Để thể hiện kết quả chính xác trong các đơn vị hữu hình, trước tiên bạn phải chuyển đổi tọa độ từ hình cầu sang hình chữ nhật hoặc tính khoảng cách bằng phương pháp vòng tròn lớn thay thế

Dịch, lật, thu nhỏ và xoay

Có thể làm phiền bạn khi tam giác xuất hiện ở góc phần tư thứ hai của hệ tọa độ Descartes. Hãy di chuyển nó sao cho tâm hình học của nó thẳng hàng với gốc tọa độ. Cả ba đỉnh sẽ được tịnh tiến theo độ dài của vectơ được chỉ định bởi tâm hình học nhưng ngược hướng

>>> 3 + 2j == 2j + 3
True
6

Lưu ý rằng bạn đang cộng hai số phức với nhau, phép cộng này thực hiện phép cộng từng phần tử của chúng. Đây là một phép biến đổi affine vì nó không làm thay đổi hình dạng của tam giác hoặc vị trí tương đối của các đỉnh của nó

Trừ hai số phức trong Python bằng lớp

Sự phản chiếu qua gương của tam giác xung quanh trục thực hoặc ảo yêu cầu đảo ngược thành phần tương ứng trong các đỉnh của nó. Ví dụ: để lật nó theo chiều ngang, bạn sẽ phải sử dụng phần âm của phần thực, tương ứng với hướng nằm ngang. Để lật nó theo chiều dọc, bạn sẽ lấy phần âm của phần ảo

>>> 3 + 2j == 2j + 3
True
7

Cái sau về cơ bản giống như tính toán liên hợp số phức, vì vậy bạn có thể gọi trực tiếp

>>> type(z)
<class 'complex'>
44 trên mỗi đỉnh để thực hiện công việc khó khăn cho bạn

>>> 3 + 2j == 2j + 3
True
8

Đương nhiên, không có gì ngăn cản bạn áp dụng tính đối xứng theo một trong hai hướng hoặc cả hai hướng cùng một lúc. Trong trường hợp như vậy, bạn có thể sử dụng toán tử trừ một ngôi trước số phức để lật phần thực và phần ảo của nó

>>> 3 + 2j == 2j + 3
True
9

Hãy tiếp tục và tìm hiểu các kết hợp lật khác nhau bằng cách sử dụng Jupyter Notebook tương tác có sẵn trong các tài liệu có thể tải xuống. Đây là hình tam giác sẽ trông như thế nào khi bạn lật nó dọc theo cả hai trục

Trừ hai số phức trong Python bằng lớp

Chia tỷ lệ tương tự như dịch, nhưng thay vì thêm phần bù, bạn sẽ nhân từng đỉnh với một thừa số không đổi, phải là một số thực

>>> 3 - 2j == 3 + (-2j)
True
0

Làm như vậy dẫn đến việc nhân cả hai thành phần của mỗi số phức với cùng một lượng. Nó sẽ kéo dài Tam giác quỷ Bermuda của bạn, làm cho nó trông lớn hơn trên cốt truyện

Trừ hai số phức trong Python bằng lớp

Mặt khác, nhân các đỉnh của tam giác với một số phức khác, có tác dụng xoay nó quanh gốc của hệ tọa độ. Điều đó khác rất nhiều so với cách bạn thường nhân các vectơ với nhau. Ví dụ: tích vô hướng của hai vectơ sẽ tạo ra một vô hướng, trong khi tích chéo của chúng trả về một vectơ mới trong không gian ba chiều, vuông góc với bề mặt mà chúng xác định

Ghi chú. Tích của hai số phức không đại diện cho phép nhân véc tơ. Thay vào đó, nó được định nghĩa là phép nhân ma trận trong không gian vectơ hai chiều, với 1 và

>>> 2 + 3j + 4 + 5j
(6+8j)
0 làm cơ sở chuẩn. Nhân (x1 + y1
>>> 2 + 3j + 4 + 5j
(6+8j)
0) với (x2 + y2
>>> 2 + 3j + 4 + 5j
(6+8j)
0) tương ứng với phép nhân ma trận sau

Trừ hai số phức trong Python bằng lớp

Đây là ma trận xoay ở bên trái, làm cho toán học hoạt động tốt

Khi bạn nhân các đỉnh với đơn vị ảo, nó sẽ xoay tam giác 90° ngược chiều kim đồng hồ. Nếu bạn cứ lặp đi lặp lại nó, cuối cùng bạn sẽ đến nơi bạn bắt đầu

Trừ hai số phức trong Python bằng lớp

Làm thế nào để bạn tìm thấy một số phức cụ thể sẽ xoay một số phức khác theo bất kỳ góc mong muốn nào khi cả hai được nhân lên?

90° rotationsTotal angleFormulaExponentValue00°z

>>> 2 + 3j + 4 + 5j
(6+8j)
001190°z ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0
>>> 2 + 3j + 4 + 5j
(6+8j)
01
>>> 2 + 3j + 4 + 5j
(6+8j)
02180°z ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0
>>> 2 + 3j + 4 + 5j
(6+8j)
02-13270°z ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0
>>> 2 + 3j + 4 + 5j
(6+8j)
03-
>>> 2 + 3j + 4 + 5j
(6+8j)
04360°z ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0
>>> 2 + 3j + 4 + 5j
(6+8j)
0415450°z ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0 ×
>>> 2 + 3j + 4 + 5j
(6+8j)
0
>>> 2 + 3j + 4 + 5j
(6+8j)
05
>>> 2 + 3j + 4 + 5j
(6+8j)
06540

Khi bạn biểu diễn phép nhân lặp đi lặp lại với

>>> 2 + 3j + 4 + 5j
(6+8j)
0 theo số mũ nguyên dương, thì một mẫu sẽ xuất hiện. Lưu ý cách nâng đơn vị tưởng tượng lên các lũy thừa tiếp theo làm cho nó lặp đi lặp lại các giá trị giống nhau. Bạn có thể ngoại suy điều này thành các số mũ phân số và mong đợi chúng tương ứng với các góc trung gian

Ví dụ, số mũ trong nửa vòng quay đầu tiên bằng 0. 5 và biểu thị góc 45°

Trừ hai số phức trong Python bằng lớp

Vì vậy, nếu bạn biết rằng lũy ​​thừa của một đại diện cho góc vuông và bất kỳ thứ gì ở giữa các tỷ lệ theo tỷ lệ, thì bạn có thể rút ra công thức chung này cho các phép quay tùy ý

>>> 3 - 2j == 3 + (-2j)
True
1

Lưu ý rằng phép quay trở nên tự nhiên hơn khi bạn biểu thị các số phức của mình theo tọa độ cực, vốn đã mô tả góc. Sau đó, bạn có thể tận dụng dạng hàm mũ để thực hiện các phép tính đơn giản hơn

Xoay theo tọa độ cựcHiển thị/Ẩn

Có hai cách để xoay một số bằng tọa độ cực

>>> 3 - 2j == 3 + (-2j)
True
2

Bạn có thể tính tổng các góc hoặc nhân số phức của mình với một vectơ đơn vị

Bạn sẽ tìm hiểu thêm về những điều đó trong phần tiếp theo

Loại bỏ các quảng cáo

Khám phá mô-đun toán học về số phức. >>> z = 3.14 + 0j >>> type(z) <class 'complex'> 9

Bạn đã thấy rằng một số hàm dựng sẵn như

>>> type(z)
<class 'complex'>
66 và
>>> type(z)
<class 'complex'>
60 chấp nhận số phức, trong khi những hàm khác thì không. Ví dụ: bạn không thể
>>> z = 3 + 2

>>> type(z)
<class 'int'>
24 một số phức vì phép toán như vậy không có ý nghĩa

>>>

>>> 3 - 2j == 3 + (-2j)
True
3

Nhiều hàm toán học nâng cao như hàm lượng giác, hypebol hoặc logarit có sẵn trong thư viện tiêu chuẩn. Đáng buồn thay, ngay cả khi bạn biết mọi thứ về mô-đun

>>> type(z)
<class 'complex'>
61 của Python, thì điều đó cũng chẳng ích gì vì không hàm nào của nó hỗ trợ số phức. Bạn sẽ cần kết hợp nó với mô-đun
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9, mô-đun xác định các hàm tương ứng cho các số phức

Mô-đun

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9 xác định lại tất cả các hằng số dấu phẩy động từ
>>> type(z)
<class 'complex'>
61 để bạn có thể sử dụng chúng mà không cần nhập cả hai mô-đun

>>>

>>> 3 - 2j == 3 + (-2j)
True
4

Lưu ý rằng

>>> z = 3 + 2

>>> type(z)
<class 'int'>
29 là một giá trị đặc biệt không bao giờ bằng bất kỳ giá trị nào khác, kể cả chính nó. Đó là lý do tại sao bạn thấy một
>>> z = 3 + 2

>>> type(z)
<class 'int'>
30 đơn độc trong kết quả ở trên. Ngoài những điều này,
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9 cung cấp hai đối tác phức tạp cho NaN (không phải là số) và vô hạn, với cả hai đều có phần thực bằng không

>>>

>>> 3 - 2j == 3 + (-2j)
True
5

Có khoảng một nửa số chức năng trong

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9 so với trong mô-đun
>>> type(z)
<class 'complex'>
61 tiêu chuẩn. Hầu hết chúng bắt chước hành vi ban đầu, nhưng một số ít là duy nhất đối với các số phức. Chúng sẽ cho phép bạn thực hiện chuyển đổi giữa hai hệ tọa độ mà bạn sẽ khám phá trong phần này

Trích xuất gốc của một số phức

Định lý cơ bản của đại số phát biểu rằng đa thức bậc n với hệ số phức có đúng n nghiệm phức. Điều đó khá quan trọng nếu bạn nghĩ về nó, vì vậy hãy để nó chìm sâu trong giây lát

Bây giờ, hãy lấy hàm bậc hai x2 + 1 làm ví dụ. Về mặt trực quan, hình parabol này không cắt trục X vì nó nằm phía trên gốc tọa độ một đơn vị. Biệt thức của hàm là âm, điều này xác nhận quan sát này về mặt số học. Đồng thời, nó là đa thức bậc hai nên nó phải có hai nghiệm phức mặc dù nó không có nghiệm thực

Để tìm các nghiệm đó, bạn có thể viết lại hàm dưới dạng phương trình bậc hai, sau đó chuyển hằng số sang bên phải và lấy căn bậc hai của cả hai vế

Trừ hai số phức trong Python bằng lớp

Trong miền số thực, căn bậc hai chỉ được xác định cho các giá trị đầu vào không âm. Do đó, gọi hàm này trong Python sẽ đưa ra một ngoại lệ với thông báo lỗi thích hợp

>>>

>>> 3 - 2j == 3 + (-2j)
True
6

Tuy nhiên, khi bạn coi √-1 là một số phức và gọi hàm liên quan từ mô-đun

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9, thì bạn sẽ nhận được một kết quả có ý nghĩa hơn

>>>

>>> 3 - 2j == 3 + (-2j)
True
7

Điều đó có ý nghĩa. Xét cho cùng, dạng trung gian x2 = -1 của phương trình bậc hai chính là định nghĩa của đơn vị ảo. Nhưng, đợi một chút. Gốc phức tạp khác đã đi đâu?

Ví dụ, đa thức bậc 4 x4 + 1, có thể viết dưới dạng phương trình x4 = -1, có bốn nghiệm phức này

  • z0 = -√2/2 + √2/2
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    0
  • z1 = -√2/2 - √2/2
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    0
  • z2 = √2/2 + √2/2
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    0
  • z3 = √2/2 - √2/2
    >>> 2 + 3j + 4 + 5j
    (6+8j)
    
    0

Nâng mỗi căn lên lũy thừa bậc 4 thì được một số phức bằng -1 + 0

>>> 2 + 3j + 4 + 5j
(6+8j)
0 hoặc một số thực -1

>>>

>>> 3 - 2j == 3 + (-2j)
True
8

Bạn sẽ nhận thấy rằng giá trị kết quả không chính xác là -1 do lỗi làm tròn trong số học dấu phẩy động. Để giải thích cho điều đó, bạn có thể gọi

>>> z = 3 + 2

>>> type(z)
<class 'int'>
40 bất cứ khi nào bạn cần biết liệu hai số phức có giá trị gần nhau hay không

>>>

>>> 3 - 2j == 3 + (-2j)
True
9

Thật không may, bạn không thể tính các nghiệm phức tạp khác bằng Python thuần túy vì phép lũy thừa thông thường luôn cho một nghiệm

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
0

Đó chỉ là một trong những gốc được liệt kê trước đây. Công thức toán tìm mọi nghiệm phức tận dụng dạng lượng giác của số phức

Trừ hai số phức trong Python bằng lớp

R và φ là tọa độ cực của số phức, trong khi n là bậc của đa thức và k là chỉ số của nghiệm, bắt đầu từ 0. Tin tốt là bạn không cần phải tự tính toán tỉ mỉ những gốc rễ đó. Cách nhanh nhất để tìm thấy chúng là cài đặt thư viện của bên thứ ba như NumPy và nhập nó vào dự án của bạn

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
1

Biết về các dạng số phức khác nhau và hệ tọa độ của chúng có thể hữu ích. Như bạn có thể thấy, nó giúp giải quyết các vấn đề thực tế như tìm nghiệm phức tạp. Vì vậy, trong phần tiếp theo, bạn sẽ đi sâu vào chi tiết hơn

Loại bỏ các quảng cáo

Chuyển đổi giữa tọa độ hình chữ nhật và cực

Về mặt hình học, bạn có thể nhìn vào một số phức gấp đôi. Một mặt, đó là một điểm có khoảng cách theo chiều ngang và chiều dọc từ điểm gốc xác định duy nhất vị trí của nó. Chúng được gọi là tọa độ hình chữ nhật bao gồm các phần thực và phần ảo

Mặt khác, bạn có thể mô tả cùng một điểm trong tọa độ cực cũng cho phép bạn tìm thấy nó một cách rõ ràng với hai khoảng cách

  1. Khoảng cách xuyên tâm là độ dài của bán kính được đo từ gốc tọa độ
  2. Khoảng cách góc là góc được đo giữa trục hoành và bán kính

Bán kính, còn được gọi là mô đun, tương ứng với độ lớn của số phức hoặc độ dài của vectơ. Góc thường được gọi là pha hoặc đối số của một số phức. Thật hữu ích khi biểu thị góc theo đơn vị radian thay vì theo độ khi làm việc với các hàm lượng giác

Đây là mô tả của một số phức trong cả hai hệ tọa độ

Trừ hai số phức trong Python bằng lớp

Do đó, một điểm (3, 2) trong hệ tọa độ Descartes có bán kính xấp xỉ 3. 6 và một góc khoảng 33. 7°, hay đại khái là π trên 5. 4 radian

Việc chuyển đổi giữa hai hệ tọa độ có thể thực hiện được nhờ một vài chức năng được tích hợp trong mô-đun

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9. Cụ thể, để lấy tọa độ cực của một số phức, bạn phải truyền nó cho
>>> z = 3 + 2

>>> type(z)
<class 'int'>
42

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
2

Nó sẽ trả về một bộ, trong đó phần tử đầu tiên là bán kính và phần tử thứ hai là góc tính bằng radian. Lưu ý rằng bán kính có cùng giá trị với độ lớn, bạn có thể tính giá trị này bằng cách gọi số phức của mình là ____2_______66. Ngược lại, nếu bạn chỉ quan tâm đến góc của một số phức, thì bạn có thể gọi

>>> z = 3 + 2

>>> type(z)
<class 'int'>
44

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
3

Góc có thể thu được bằng cách sử dụng lượng giác cơ bản vì phần thực, phần ảo và độ lớn cùng nhau tạo thành một tam giác vuông

Trừ hai số phức trong Python bằng lớp

Bạn có thể sử dụng các hàm lượng giác nghịch đảo, chẳng hạn như arcsine, từ

>>> type(z)
<class 'complex'>
61 hoặc
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9, nhưng hàm sau sẽ tạo ra các giá trị phức tạp với phần ảo bằng 0

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
4

Tuy nhiên, có một chi tiết nhỏ cần cẩn thận khi sử dụng hàm arctangent, điều này đã khiến nhiều ngôn ngữ lập trình phát triển một triển khai thay thế có tên là

>>> z = 3 + 2

>>> type(z)
<class 'int'>
47. Việc tính toán tỷ lệ giữa phần ảo và phần thực đôi khi có thể tạo ra một điểm kỳ dị do, ví dụ, phép chia cho 0. Hơn nữa, các dấu hiệu riêng của hai giá trị bị mất trong quá trình, khiến cho việc xác định góc một cách chắc chắn là không thể.

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
5

Lưu ý cách

>>> z = 3 + 2

>>> type(z)
<class 'int'>
48 không nhận ra hai điểm khác nhau nằm ở các góc phần tư đối diện của hệ tọa độ. Mặt khác,
>>> z = 3 + 2

>>> type(z)
<class 'int'>
47 mong đợi hai đối số thay vì một đối số để bảo toàn các dấu hiệu riêng lẻ trước khi chia cho nhau và cũng tránh các vấn đề khác

Để lấy độ thay vì radian, bạn có thể thực hiện chuyển đổi cần thiết bằng cách sử dụng lại mô-đun

>>> type(z)
<class 'complex'>
61

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
6

Đảo ngược quy trình—nghĩa là chuyển đổi tọa độ cực thành tọa độ vuông góc—dựa vào một chức năng khác. Tuy nhiên, bạn không thể chuyển cùng một bộ dữ liệu mà bạn đã nhận được từ

>>> z = 3 + 2

>>> type(z)
<class 'int'>
42 vì
>>> z = 3 + 2

>>> type(z)
<class 'int'>
52 mong đợi hai đối số riêng biệt

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
7

Bạn nên giải nén bộ dữ liệu trước khi thực hiện một nhiệm vụ và đặt tên mô tả cho các phần tử đó. Bây giờ bạn có thể gọi chính xác

>>> z = 3 + 2

>>> type(z)
<class 'int'>
52

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
8

Bạn có thể gặp phải các lỗi làm tròn trong khi Python thực hiện các phép tính. Đằng sau hậu trường, nó gọi các hàm lượng giác để lấy phần thực và phần ảo

>>>

>>> z = 3.14
>>> type(z)
<class 'float'>
9

Một lần nữa, việc bạn sử dụng

>>> type(z)
<class 'complex'>
61 hay
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9 trong trường hợp này không quan trọng vì kết quả sẽ giống hệt nhau

Loại bỏ các quảng cáo

Biểu diễn số phức theo cách khác

Bất kể hệ tọa độ là gì, bạn có thể biểu diễn cùng một số phức trong một vài dạng tương đương về mặt toán học

  • Đại số (tiêu chuẩn)
  • hình học
  • lượng giác
  • số mũ

Danh sách này không đầy đủ vì có nhiều biểu diễn hơn, chẳng hạn như số phức

Có sự lựa chọn cho phép bạn chọn một cách thuận tiện nhất để giải quyết một vấn đề nhất định. Ví dụ: bạn sẽ cần dạng hàm mũ để tính biến đổi Fourier rời rạc trong phần sắp tới. Sử dụng dạng này cũng phù hợp với phép nhân và phép chia số phức

Dưới đây là tóm tắt nhanh về các dạng số phức riêng lẻ và tọa độ của chúng

DạngHình chữ nhậtCựcĐại sốz = x + y

>>> 2 + 3j + 4 + 5j
(6+8j)
0-Hình họcz = (x, y)z = (r, φ)Lượng giácz =. z. (cos(x/. z. ) +
>>> 2 + 3j + 4 + 5j
(6+8j)
0sin(y/. z. ))z = r(cos(φ) +
>>> 2 + 3j + 4 + 5j
(6+8j)
0sin(φ))Số mũz =. z. e
>>> z = 3 + 2

>>> type(z)
<class 'int'>
59z = r(e
>>> 2 + 3j + 4 + 5j
(6+8j)
0φ)

Dạng đại số có nguồn gốc từ Python khi bạn chỉ định các số phức bằng chữ của chúng. Bạn cũng có thể xem chúng dưới dạng các điểm trên mặt phẳng Euclide trong hệ tọa độ Descartes hoặc cực. Mặc dù không có biểu diễn riêng biệt cho dạng lượng giác hoặc hàm mũ trong Python, nhưng bạn có thể xác minh xem các nguyên tắc toán học có đúng không

Ví dụ, thay công thức Euler về dạng lượng giác sẽ biến nó thành dạng mũ. Bạn có thể gọi

>>> z = 3 + 2

>>> type(z)
<class 'int'>
62 của mô-đun
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9 hoặc nâng hằng số
>>> z = 3 + 2

>>> type(z)
<class 'int'>
63 lên một lũy thừa để có được kết quả tương tự

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
0

Tất cả các biểu mẫu thực sự là những cách khác nhau để mã hóa cùng một số. Tuy nhiên, bạn không thể so sánh chúng trực tiếp do lỗi làm tròn số có thể xảy ra trong thời gian chờ đợi. Sử dụng

>>> z = 3 + 2

>>> type(z)
<class 'int'>
40 để so sánh an toàn hoặc
>>> z = 3 + 2

>>> type(z)
<class 'int'>
65 các số dưới dạng chuỗi một cách thích hợp. Bạn sẽ tìm hiểu cách định dạng các chuỗi như vậy trong phần sắp tới

Giải thích tại sao các dạng khác nhau của một số phức lại tương đương nhau đòi hỏi phải tính toán và vượt xa phạm vi của hướng dẫn này. Tuy nhiên, nếu bạn quan tâm đến toán học, thì bạn sẽ thấy mối liên hệ giữa các lĩnh vực toán học khác nhau được thể hiện bằng các số phức thật hấp dẫn

Phân tích một số phức trong Python

Bạn đã học được rất nhiều về số phức Python và đã xem các ví dụ sơ bộ. Tuy nhiên, trước khi tiếp tục, bạn nên đề cập đến một số chủ đề cuối cùng. Trong phần này, bạn sẽ xem xét việc so sánh các số phức, định dạng các chuỗi chứa chúng, v.v.

Kiểm tra đẳng thức của số phức

Về mặt toán học, hai số phức bằng nhau khi chúng có các giá trị giống hệt nhau bất kể hệ tọa độ được sử dụng. Tuy nhiên, việc chuyển đổi giữa tọa độ cực và tọa độ hình chữ nhật thường gây ra lỗi làm tròn trong Python, vì vậy bạn cần chú ý đến những khác biệt nhỏ khi so sánh chúng

Ví dụ: khi bạn xem xét một điểm trên một đường tròn đơn vị có bán kính bằng 1 và nghiêng 60°, thì lượng giác hoạt động độc đáo, giúp việc chuyển đổi bằng bút và giấy trở nên đơn giản

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
1

Mặc dù bạn biết rằng

>>> z = 3 + 2

>>> type(z)
<class 'int'>
66 và
>>> z = 3 + 2

>>> type(z)
<class 'int'>
67 giống nhau, nhưng Python không thể xác định điều đó do lỗi làm tròn. May mắn thay, tài liệu PEP 485 đã định nghĩa các hàm cho đẳng thức gần đúng, có sẵn trong các mô-đun
>>> type(z)
<class 'complex'>
61 và
>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
9

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
2

Hãy nhớ luôn sử dụng chúng khi so sánh các số phức. Nếu dung sai mặc định không đủ tốt cho các tính toán của bạn, bạn có thể thay đổi nó bằng cách chỉ định

Sắp xếp các số phức

Nếu bạn đã quen thuộc với các bộ dữ liệu, thì bạn biết rằng Python có thể sắp xếp chúng

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
3

Theo mặc định, các bộ dữ liệu riêng lẻ được so sánh từ trái sang phải

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
4

Trong trường hợp đầu tiên, số

>>> z = 3 + 2

>>> type(z)
<class 'int'>
70 lớn hơn số
>>> z = 3 + 2

>>> type(z)
<class 'int'>
71, vì vậy tên hành tinh hoàn toàn không được xem xét. Họ có thể giúp giải quyết một sự ràng buộc, mặc dù. Tuy nhiên, đó không phải là trường hợp của số phức vì chúng không xác định quan hệ thứ tự tự nhiên. Ví dụ: bạn sẽ gặp lỗi nếu cố gắng so sánh hai số phức

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
5

Kích thước tưởng tượng có nên nặng hơn kích thước thực không? . Vì bạn không thể so sánh trực tiếp các số phức nên bạn cần cho Python biết cách sắp xếp chúng bằng cách chỉ định một hàm khóa tùy chỉnh, chẳng hạn như

>>> type(z)
<class 'complex'>
66

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
6

Điều này sẽ sắp xếp các số phức theo độ lớn của chúng theo thứ tự giảm dần

Định dạng số phức dưới dạng chuỗi

Không có bất kỳ định dạng cụ thể nào đối với số phức, nhưng bạn có thể định dạng riêng phần thực và phần ảo của chúng bằng cách sử dụng mã tiêu chuẩn cho số dấu phẩy động. Dưới đây, bạn sẽ tìm thấy một số kỹ thuật chứng minh điều này. Một số trong số chúng sẽ thực sự áp dụng trình xác định định dạng của bạn cho cả phần thực và phần ảo trong một lần

Ghi chú. Định dạng chuỗi có thể cho phép bạn bỏ qua lỗi biểu diễn dấu phẩy động và giả vờ như nó không tồn tại

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
7

Chữ cái

>>> z = 3 + 2

>>> type(z)
<class 'int'>
73 trong công cụ xác định định dạng là viết tắt của định dạng chung, làm tròn số của bạn đến độ chính xác được yêu cầu. Độ chính xác mặc định là sáu chữ số có nghĩa

Hãy lấy số phức sau đây làm ví dụ và định dạng nó bằng hai chữ số thập phân trên cả hai phần

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
8

Một cách nhanh chóng để làm điều này là bằng cách gọi

>>> z = 3 + 2

>>> type(z)
<class 'int'>
65 với một bộ xác định định dạng số hoặc bằng cách tạo một chuỗi f được định dạng phù hợp

>>>

>>> z = 3.14j
>>> type(z)
<class 'complex'>
9

Ví dụ: nếu bạn muốn kiểm soát nhiều hơn để thêm phần đệm bổ sung xung quanh toán tử dấu cộng, thì chuỗi f sẽ là lựa chọn tốt hơn

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
0

Bạn cũng có thể gọi

>>> z = 3 + 2

>>> type(z)
<class 'int'>
75 trên một đối tượng chuỗi và truyền các đối số vị trí hoặc từ khóa cho nó

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
1

Các đối số vị trí cung cấp một chuỗi các giá trị, trong khi các đối số từ khóa cho phép bạn gọi chúng theo tên. Tương tự, bạn có thể sử dụng (

>>> z = 3 + 2

>>> type(z)
<class 'int'>
76) với bộ dữ liệu hoặc từ điển

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
2

Tuy nhiên, điều này sử dụng một cú pháp giữ chỗ khác và hơi lỗi thời

Tạo kiểu dữ liệu phức tạp của riêng bạn

Mô hình dữ liệu Python định nghĩa một tập hợp các phương thức đặc biệt mà bạn có thể triển khai để làm cho các lớp của bạn tương thích với một số kiểu dựng sẵn nhất định. Giả sử bạn đang làm việc với các điểm và vectơ và muốn lấy góc giữa hai vectơ liên kết. Bạn có thể tính tích vô hướng của họ và thực hiện một số phép đo lượng giác. Ngoài ra, bạn có thể tận dụng các số phức

Trước tiên hãy xác định các lớp của bạn

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
3

Một

>>> z = 3 + 2

>>> type(z)
<class 'int'>
77 có tọa độ
>>> type(z)
<class 'complex'>
14 và
>>> type(z)
<class 'complex'>
15, trong khi một
>>> z = 3 + 2

>>> type(z)
<class 'int'>
80 nối hai điểm. Bạn có thể nhớ
>>> z = 3 + 2

>>> type(z)
<class 'int'>
44, tính toán khoảng cách góc của một số phức. Bây giờ, nếu bạn coi các vectơ của mình là số phức và biết pha của chúng, thì bạn có thể trừ chúng để có được góc mong muốn

Để làm cho Python nhận ra các trường hợp vectơ dưới dạng số phức, bạn phải cung cấp ____________82 trong phần thân của lớp

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
4

Mã bên trong phải luôn trả về một thể hiện của kiểu dữ liệu

>>> type(z)
<class 'complex'>
17, do đó, mã này thường tạo một số phức mới từ đối tượng của bạn. Ở đây, bạn đang trừ các điểm đầu và điểm cuối để có được các chuyển vị ngang và dọc, đóng vai trò là phần thực và phần ảo. Phương thức này sẽ chạy thông qua ủy quyền khi bạn gọi toàn cầu
>>> type(z)
<class 'complex'>
11 trên một thể hiện vectơ

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
5

Trong một số trường hợp, bạn không cần phải tự đúc kiểu này. Hãy xem một ví dụ trong thực tế

>>>

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
6

Bạn có hai vectơ được xác định bởi bốn điểm phân biệt. Tiếp theo, bạn chuyển chúng trực tiếp tới

>>> z = 3 + 2

>>> type(z)
<class 'int'>
44, nó thực hiện việc chuyển đổi thành số phức cho bạn và trả về pha. Độ lệch pha là góc giữa hai vectơ

Điều đó không đẹp sao?

Tính phép biến đổi Fourier rời rạc với số phức

Mặc dù bạn có thể sử dụng các số thực để tính các hệ số sin và cosin của các tần số của hàm tuần hoàn với biến đổi Fourier, nhưng sẽ thuận tiện hơn nếu chỉ xử lý một hệ số phức trên mỗi tần số. Biến đổi Fourier rời rạc trong miền phức tạp được cho bởi công thức sau

Trừ hai số phức trong Python bằng lớp

Đối với mỗi ngăn tần số k, nó đo lường mối tương quan của tín hiệu và một sóng hình sin cụ thể được biểu thị dưới dạng số phức ở dạng hàm mũ. (Cảm ơn Leonhard Euler. ) Tần số góc của sóng có thể được tính bằng cách nhân góc tròn là 2π radian với k trên số mẫu rời rạc

Trừ hai số phức trong Python bằng lớp

Viết mã này bằng Python trông khá gọn gàng khi bạn tận dụng kiểu dữ liệu

>>> type(z)
<class 'complex'>
17

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
7

Hàm này là phiên âm theo nghĩa đen của các công thức trên. Giờ đây, bạn có thể chạy phân tích tần số trên âm thanh mà bạn tải từ tệp âm thanh bằng mô-đun

>>> z = 3 + 2

>>> type(z)
<class 'int'>
87 của Python hoặc bạn tổng hợp từ đầu. Một trong những Máy tính xách tay Jupyter đi kèm với hướng dẫn này cho phép bạn chơi với tổng hợp và phân tích âm thanh một cách tương tác

Để vẽ phổ tần số bằng Matplotlib, bạn phải biết tần số lấy mẫu, tần số này xác định độ phân giải của ngăn tần số cũng như giới hạn Nyquist

>>> z = 3.14 + 0j
>>> type(z)
<class 'complex'>
8

Số lượng ngăn tần số trong quang phổ bằng một nửa số mẫu, trong khi tần số Nyquist giới hạn tần số cao nhất bạn có thể đo được. Biến đổi trả về một số phức có độ lớn tương ứng với biên độ của sóng hình sin ở tần số đã cho, trong khi góc của nó là pha

Ghi chú. Để có được các giá trị biên độ chính xác, bạn phải nhân đôi số và chia độ lớn kết quả cho số lượng mẫu. Mặt khác, nếu bạn chỉ quan tâm đến biểu đồ tần số, thì bạn có thể chuẩn hóa độ lớn theo tổng của chúng hoặc tần số tối đa

Đây là biểu đồ tần số mẫu của sóng âm bao gồm ba âm—440 Hz, 1. 5 kHz và 5 kHz—có biên độ bằng nhau

Trừ hai số phức trong Python bằng lớp
Biểu đồ phổ tần số

Lưu ý rằng đây là một ví dụ học thuật thuần túy vì việc tính toán biến đổi Fourier rời rạc với các phép lặp lồng nhau có O(n2) , khiến nó không thể sử dụng được trong thực tế. Đối với các ứng dụng thực tế, bạn muốn sử dụng thuật toán biến đổi Fourier nhanh (FFT) được triển khai tốt nhất trong thư viện C, chẳng hạn như FFT trong SciPy

Phần kết luận

Việc dễ dàng sử dụng các số phức trong Python khiến chúng trở thành một công cụ thiết thực và thú vị một cách đáng ngạc nhiên. Bạn đã thấy các vectơ hai chiều được triển khai thực tế miễn phí và bạn có thể phân tích tần số âm thanh nhờ chúng. Các số phức cho phép bạn diễn đạt các công thức toán học trong mã một cách tao nhã mà không cần nhiều cú pháp soạn sẵn cản trở

Trong hướng dẫn này, bạn đã học cách

  • Xác định số phức bằng chữ trong Python
  • Biểu diễn các số phức trong hệ tọa độ vuông góc và cực
  • Sử dụng số phức trong biểu thức số học
  • Tận dụng mô-đun
    >>> z = 3.14 + 0j
    >>> type(z)
    <class 'complex'>
    
    9 tích hợp
  • Dịch các công thức toán học trực tiếp sang mã Python

Cho đến nay, trải nghiệm của bạn với số phức Python là gì?

Bạn có thể nhấp vào liên kết bên dưới để lấy mã nguồn đầy đủ cho hướng dẫn này

Nhận mã mẫu. Nhấp vào đây để lấy mã mẫu mà bạn sẽ sử dụng để tìm hiểu về số phức trong Python trong hướng dẫn này

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Trừ hai số phức trong Python bằng lớp

Gửi cho tôi thủ thuật Python »

Giới thiệu về Bartosz Zaczyński

Trừ hai số phức trong Python bằng lớp
Trừ hai số phức trong Python bằng lớp

Bartosz là người hướng dẫn bootcamp, tác giả và lập trình viên đa ngôn ngữ yêu thích Python. Anh ấy giúp sinh viên của mình tiếp cận công nghệ phần mềm bằng cách chia sẻ kinh nghiệm thương mại hơn một thập kỷ trong ngành CNTT

» Thông tin thêm về Bartosz


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Trừ hai số phức trong Python bằng lớp

Aldren

Trừ hai số phức trong Python bằng lớp

David

Trừ hai số phức trong Python bằng lớp

Geir Arne

Trừ hai số phức trong Python bằng lớp

Joanna

Trừ hai số phức trong Python bằng lớp

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi