Đơn giản hóa chức năng chuyển python

Các khái niệm được thảo luận trong chương trước rất hữu ích cho việc thu gọn (đơn giản hóa) các sơ đồ khối

Quy tắc rút gọn sơ đồ khối

Thực hiện theo các quy tắc sau để đơn giản hóa (thu gọn) sơ đồ khối, có nhiều khối, điểm tổng và điểm cất cánh

  • Quy tắc 1 - Kiểm tra các khối được kết nối nối tiếp và đơn giản hóa

  • Quy tắc 2 - Kiểm tra các khối được kết nối song song và đơn giản hóa

  • Quy tắc 3 - Kiểm tra các khối được kết nối trong vòng phản hồi và đơn giản hóa

  • Quy tắc 4 - Nếu gặp khó khăn với điểm cất cánh trong khi đơn giản hóa, hãy chuyển nó sang phải

  • Quy tắc 5 - Nếu gặp khó khăn với điểm tổng trong khi rút gọn, hãy chuyển nó sang trái

  • Quy tắc 6 - Lặp lại các bước trên cho đến khi bạn có dạng đơn giản hóa, i. e. , khối đơn

Lưu ý - Hàm truyền có trong khối đơn này là hàm truyền của sơ đồ khối tổng thể

Thí dụ

Xét sơ đồ khối như hình vẽ sau. Hãy để chúng tôi đơn giản hóa (thu gọn) sơ đồ khối này bằng cách sử dụng các quy tắc rút gọn sơ đồ khối

Đơn giản hóa chức năng chuyển python

Bước 1 - Sử dụng Quy tắc 1 cho các khối $G_1$ và $G_2$. Sử dụng Quy tắc 2 cho các khối $G_3$ và $G_4$. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây

Đơn giản hóa chức năng chuyển python

Bước 2 – Sử dụng Quy tắc 3 cho các khối $G_1G_2$ và $H_1$. Sử dụng Quy tắc 4 để chuyển điểm cất cánh sau khối $G_5$. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây

Đơn giản hóa chức năng chuyển python

Bước 3 – Sử dụng Quy tắc 1 cho các khối $(G_3 + G_4)$ và $G_5$. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây

Đơn giản hóa chức năng chuyển python

Bước 4 - Sử dụng Quy tắc 3 cho các khối $(G_3 + G_4)G_5$ và $H_3$. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây

Đơn giản hóa chức năng chuyển python

Bước 5 - Sử dụng Quy tắc 1 cho các khối được kết nối nối tiếp. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây

Đơn giản hóa chức năng chuyển python

Bước 6 - Sử dụng Quy tắc 3 cho các khối được kết nối trong vòng phản hồi. Sơ đồ khối sửa đổi được hiển thị trong hình dưới đây. Đây là sơ đồ khối đơn giản hóa

Đơn giản hóa chức năng chuyển python

Do đó, hàm truyền của hệ thống là

$$\frac{Y(s)}{R(s)}=\frac{G_1G_2G_5^2(G_3+G_4)}{(1+G_1G_2H_1)\lbrace 1+(G_3+G_4)G_5H_3\rbrace G_5-G_1G_2G_5

Lưu ý - Làm theo các bước sau để tính hàm truyền của sơ đồ khối có nhiều đầu vào

  • Bước 1 - Tìm hàm truyền của sơ đồ khối bằng cách xem xét một đầu vào tại một thời điểm và đặt các đầu vào còn lại bằng 0

  • Bước 2 - Lặp lại bước 1 cho các đầu vào còn lại

  • Bước 3 - Nhận hàm truyền tổng thể bằng cách thêm tất cả các hàm truyền đó

Quá trình rút gọn sơ đồ khối mất nhiều thời gian hơn đối với các hệ thống phức tạp. Bởi vì, chúng ta phải vẽ sơ đồ khối (đơn giản hóa một phần) sau mỗi bước. Vì vậy, để khắc phục nhược điểm này, người ta sử dụng đồ thị luồng tín hiệu (biểu diễn)

Trong hai chương tiếp theo, chúng ta sẽ thảo luận về các khái niệm liên quan đến đồ thị luồng tín hiệu, i. e. , cách biểu diễn đồ thị luồng tín hiệu từ một sơ đồ khối nhất định và tính toán hàm truyền chỉ bằng cách sử dụng công thức khuếch đại mà không thực hiện bất kỳ quy trình rút gọn nào

Bây giờ chúng ta hãy nhảy vào và làm một số toán học thú vị. Một trong những tính năng hữu ích nhất của hệ thống thao tác ký hiệu là khả năng đơn giản hóa các biểu thức toán học. SymPy có hàng chục chức năng để thực hiện các loại đơn giản hóa khác nhau. Ngoài ra còn có một hàm chung được gọi là

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 cố gắng áp dụng tất cả các hàm này theo cách thông minh để đạt được dạng biểu thức đơn giản nhất. Dưới đây là một số ví dụ

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)

Ở đây,

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
1 là \(\Gamma(x)\) , hàm gamma. Chúng tôi thấy rằng
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 có khả năng xử lý một lớp biểu thức lớn.

Nhưng

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 có một cạm bẫy. Nó chỉ áp dụng tất cả các hoạt động đơn giản hóa chính trong SymPy và sử dụng phương pháp phỏng đoán để xác định kết quả đơn giản nhất. Nhưng “đơn giản nhất” không phải là một thuật ngữ được định nghĩa rõ ràng. Ví dụ: giả sử chúng ta muốn “đơn giản hóa” \(x^2 + 2x + 1\) thành \ . :

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1

Chúng tôi đã không nhận được những gì chúng tôi muốn. Có một hàm để thực hiện việc đơn giản hóa này, được gọi là

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4, sẽ được thảo luận bên dưới

Một cạm bẫy khác đối với

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 là nó có thể chậm một cách không cần thiết, vì nó thử nhiều kiểu đơn giản hóa trước khi chọn ra cái tốt nhất. Nếu bạn đã biết chính xác mình đang theo đuổi loại đơn giản hóa nào, thì tốt hơn là áp dụng (các) hàm đơn giản hóa cụ thể để áp dụng những đơn giản hóa đó

Áp dụng các chức năng đơn giản hóa cụ thể thay vì

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 cũng có lợi thế là các chức năng cụ thể có những đảm bảo nhất định về dạng đầu ra của chúng. Những điều này sẽ được thảo luận với từng chức năng bên dưới. Ví dụ,
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4, khi được gọi trên một đa thức có hệ số hữu tỉ, được đảm bảo để phân tích đa thức thành các thừa số bất khả quy.
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 không có bảo đảm. Nó hoàn toàn mang tính phỏng đoán, và như chúng ta đã thấy ở trên, nó thậm chí có thể bỏ lỡ một kiểu đơn giản hóa khả thi mà SymPy có khả năng thực hiện

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 là tốt nhất khi được sử dụng tương tác, khi bạn chỉ muốn rút gọn một biểu thức thành một dạng đơn giản hơn. Sau đó, bạn có thể chọn áp dụng các hàm cụ thể sau khi bạn thấy kết quả mà
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0 trả về, để có được kết quả chính xác hơn. Nó cũng hữu ích khi bạn không biết một biểu thức sẽ ở dạng nào và bạn cần một hàm catchall để đơn giản hóa nó

Đa thức/Đơn giản hóa hàm hữu tỉ#

mở rộng#

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
31 là một trong những chức năng đơn giản hóa phổ biến nhất trong SymPy. Mặc dù nó có rất nhiều phạm vi, nhưng bây giờ, chúng ta sẽ xem xét chức năng của nó trong việc mở rộng các biểu thức đa thức. Ví dụ

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
4

Cho một đa thức,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
31 sẽ đưa nó về dạng chính tắc của tổng các đơn thức

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
31 nghe có vẻ không giống một chức năng đơn giản hóa. Xét cho cùng, đúng như tên gọi của nó, nó làm cho các biểu thức lớn hơn chứ không phải nhỏ hơn. Thông thường đây là trường hợp, nhưng thường thì một biểu thức sẽ trở nên nhỏ hơn khi gọi _____131 trên nó do bị hủy

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
8

hệ số#

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4 lấy một đa thức và nhân nó thành thừa số bất khả qui trên các số hữu tỉ. Ví dụ

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0

Đối với đa thức,

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4 là số đối của
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
31.
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4 sử dụng thuật toán phân tích thừa số đa biến hoàn chỉnh trên các số hữu tỷ, có nghĩa là mỗi thừa số do
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4 trả về được đảm bảo là không thể rút gọn

Nếu bạn quan tâm đến chính các yếu tố, thì

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
50 sẽ trả về kết quả có cấu trúc hơn

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])

Lưu ý rằng đầu vào của

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
51 và
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
52 không nhất thiết phải là đa thức theo nghĩa chặt chẽ. Chúng sẽ phân tích thành nhân tử hoặc mở rộng bất kỳ loại biểu thức nào một cách thông minh (mặc dù lưu ý rằng các nhân tử có thể không phải là bất khả quy nếu đầu vào không còn là đa thức trên các hữu tỉ)

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
3

sưu tầm#

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
53 thu thập các lũy thừa chung của một thuật ngữ trong một biểu thức. Ví dụ

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
5

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
53 đặc biệt hữu ích khi kết hợp với phương pháp
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
55.
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
56 đưa ra hệ số của
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
57 trong
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
58

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
7

sự hủy bỏ#

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
59 sẽ lấy bất kỳ hàm hữu tỷ nào và đặt nó ở dạng chính tắc chuẩn, \(\frac{p}{q}\) . e. , là số nguyên). \(p\) and \(q\) are expanded polynomials with no common factors, and the leading coefficients of \(p\) and \(q\) do not have denominators (i.e., are integers).

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
0

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
1

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
2

Lưu ý rằng vì

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4 sẽ phân tích hoàn toàn cả tử số và mẫu số của một biểu thức, nên nó cũng có thể được sử dụng để làm điều tương tự

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
3

Tuy nhiên, nếu bạn chỉ quan tâm đến việc đảm bảo rằng biểu thức ở dạng bị hủy, thì

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
59 sẽ hiệu quả hơn
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
4

riêng biệt#

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
73 thực hiện phân tách một phần phân số trên một hàm hợp lý

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
4

Đơn giản hóa lượng giác#

Ghi chú

SymPy tuân theo các quy ước đặt tên của Python cho các hàm lượng giác nghịch đảo, đó là nối thêm một

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
74 vào trước tên của hàm. Ví dụ, cosin nghịch đảo, hoặc cosin cung, được gọi là
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
75

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
5

trigsimp#

Để đơn giản hóa các biểu thức bằng cách sử dụng danh tính lượng giác, hãy sử dụng

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
76

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
6

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
76 cũng hoạt động với các hàm lượng giác hyperbolic

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
7

Giống như

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
0,
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
76 áp dụng nhiều định danh lượng giác khác nhau cho biểu thức đầu vào, sau đó sử dụng phương pháp phỏng đoán để trả về biểu thức "tốt nhất"

expand_trig#

Để mở rộng các hàm lượng giác, nghĩa là áp dụng tổng hoặc đồng nhất hai góc, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
00

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
8

Bởi vì

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
00 có xu hướng làm cho các biểu thức lượng giác lớn hơn và ________ 376 có xu hướng làm cho chúng nhỏ hơn, những đồng nhất này có thể được áp dụng ngược lại bằng cách sử dụng ________ 376

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
9

quyền hạn #

Trước khi chúng tôi giới thiệu các hàm đơn giản hóa lũy thừa, một cuộc thảo luận toán học về các đồng nhất được nắm giữ bởi các lũy thừa là theo thứ tự. Có ba loại danh tính thỏa mãn bởi số mũ

  1. \(x^ax^b = x^{a + b}\)

  2. \(x^ay^a = (xy)^a\)

  3. \((x^a)^b = x^{ab}\)

Danh tính 1 luôn đúng

Danh tính 2 không phải lúc nào cũng đúng. Ví dụ: nếu \(x = y = -1\)\(a = \frac{1 . Tuy nhiên, danh tính 2 là đúng ít nhất nếu , then \(x^ay^a = \sqrt{-1}\sqrt{-1} = i\cdot i = -1\), whereas \((xy)^a = \sqrt{-1\cdot-1} = \sqrt{1} = 1\). However, identity 2 is true at least if \(x\)\(y\) are nonnegative and \(a\) is real (it may also be true under other conditions as well). A common consequence of the failure of identity 2 is that \(\sqrt{x}\sqrt{y} \neq \sqrt{xy}\) .

Danh tính 3 không phải lúc nào cũng đúng. Ví dụ: nếu \(x = -1\) , \(a = 2\), and \(b = \frac{1}{2}\), then \((x^a)^b = {\left((-1)^2\right)}^{1/2} = \sqrt{1} = 1\) and \(x^{ab} = (-1)^{2\cdot1/2} = (-1)^1 = -1\). However, identity 3 is true when \(b\) là một số nguyên (một lần nữa, nó cũng có thể đúng trong các trường hợp khác). Hai hậu quả phổ biến của lỗi danh tính 3 là \(\sqrt{x^2}\neq x\)\(\sqrt{\frac{1}{x}} \neq \frac{1}{\sqrt{x}}\).

Để tóm tắt

Xác thực

Đủ điều kiện để nắm giữ

Phản ví dụ khi điều kiện không được đáp ứng

hậu quả quan trọng

  1. \(x^ax^b = x^{a + b}\)

Luôn luôn đúng

Không có

Không có

  1. \(x^ay^a = (xy)^a\)

\(x, y \geq 0\)\(a \in \mathbb{R}\)

\((-1)^{1/2}(-1)^{1/2} \neq (-1\cdot-1)^{1/2}\)

\(\sqrt{x}\sqrt{y} \neq \sqrt{xy}\) nói chung

  1. \((x^a)^b = x^{ab}\)

\(b \in \mathbb{Z}\)

\({\left((-1)^2\right)}^{1/2} \neq (-1)^{2\cdot1/2}\)

\(\sqrt{x^2}\neq x\)\(\sqrt{\frac{1}{x in general

Đây là điều quan trọng cần nhớ, bởi vì theo mặc định, SymPy sẽ không thực hiện đơn giản hóa nếu chúng không đúng về tổng thể

Để làm cho SymPy thực hiện các đơn giản hóa liên quan đến danh tính chỉ đúng theo một số giả định nhất định, chúng tôi cần đặt các giả định cho Biểu tượng của mình. Chúng ta sẽ thảo luận đầy đủ về hệ thống giả định sau, nhưng bây giờ, tất cả những gì chúng ta cần biết là những điều sau đây

  • Theo mặc định, Biểu tượng SymPy được coi là phức tạp (các phần tử của \(\mathbb{C}\) ). Nghĩa là, một sự đơn giản hóa sẽ không được áp dụng cho một biểu thức với một Ký hiệu đã cho trừ khi nó đúng với tất cả các số phức.

  • Các biểu tượng có thể được đưa ra các giả định khác nhau bằng cách chuyển giả định cho

    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    04. Đối với phần còn lại của phần này, chúng tôi sẽ giả sử rằng
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    05 và
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    06 là dương, và rằng
    >>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
    (1, [(z, 1), (x + 2⋅y, 2)])
    
    74 và
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    08 là có thật. Chúng tôi sẽ để lại
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    09,
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    10 và
    >>> simplify(sin(x)**2 + cos(x)**2)
    1
    >>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
    x - 1
    >>> simplify(gamma(x)/gamma(x - 2))
    (x - 2)⋅(x - 1)
    
    11 dưới dạng các Ký hiệu phức tạp tùy ý để chứng minh điều gì xảy ra trong trường hợp đó

    >>> simplify(x**2 + 2*x + 1)
     2
    x  + 2⋅x + 1
    
    0

Ghi chú

Trong SymPy,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
12 chỉ là lối tắt đến
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
13. Chúng chính xác là cùng một đối tượng

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
1

powsimp#

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14 áp dụng danh tính 1 và 2 từ trên xuống, từ trái sang phải

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
2

Lưu ý rằng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14 từ chối thực hiện việc đơn giản hóa nếu nó không hợp lệ

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
3

Nếu bạn biết rằng bạn muốn áp dụng sự đơn giản hóa này, nhưng bạn không muốn làm rối tung các giả định, bạn có thể chuyển cờ

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
16. Điều này sẽ buộc quá trình đơn giản hóa diễn ra, bất kể các giả định

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
4

Lưu ý rằng trong một số trường hợp, đặc biệt, khi số mũ là số nguyên hoặc số hữu tỉ và đẳng thức 2 được giữ, nó sẽ tự động được áp dụng

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
5

Điều này có nghĩa là sẽ không thể hoàn tác danh tính này với

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14, bởi vì ngay cả khi
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14 đặt các cơ sở lại với nhau, chúng sẽ tự động tách ra một lần nữa

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
6

expand_power_exp / expand_power_base#

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
19 và
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
20 áp dụng danh tính 1 và 2 tương ứng từ phải sang trái

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
7

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
8

Như với

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14, danh tính 2 không được áp dụng nếu nó không hợp lệ

>>> simplify(x**2 + 2*x + 1)
 2
x  + 2⋅x + 1
9

Và như với

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14, bạn có thể buộc quá trình mở rộng diễn ra mà không cần thay đổi các giả định bằng cách sử dụng
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
16

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
40

Như với danh tính 2, danh tính 1 được áp dụng tự động nếu lũy thừa là một số và do đó không thể hoàn tác với

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
19

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
41

bột mịn nhất

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
25 áp dụng danh tính 3, từ trái sang phải

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
42

Như trước đây, danh tính không được áp dụng nếu nó không đúng theo các giả định đã cho

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
43

Và như trước đây, điều này có thể được ghi đè thủ công bằng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
16

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
44

Hàm mũ và logarit#

Ghi chú

Trong SymPy, cũng như trong Python và hầu hết các ngôn ngữ lập trình,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
27 là logarit tự nhiên, còn được gọi là
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
28. SymPy tự động cung cấp bí danh
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
29 trong trường hợp bạn quên điều này

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
45

Logarit có những vấn đề tương tự như quyền hạn. Có hai danh tính chính

  1. \(\log{(xy)} = \log{(x)} + \log{(y)}\)

  2. \(\log{(x^n)} = n\log{(x)}\)

Không có danh tính nào đúng với phức tùy ý \(x\)\(y\) . Tuy nhiên, điều kiện đủ để giữ danh tính là nếu , due to the branch cut in the complex plane for the complex logarithm. However, sufficient conditions for the identities to hold are if \(x\)\(y\)< . are positive and \(n\) is real.

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
46

Như trước đây,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
09 và
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
10 sẽ là Biểu tượng không có giả định bổ sung

Lưu ý rằng danh tính \(\log{\left(\frac{x}{y}\right)} = \log(x) - \log(y) . is a special case of identities 1 and 2 by \(\log{\left(\frac{x}{y}\right)} =\) \(\log{\left(x\cdot\frac{1}{y}\right)} =\) \(\log(x) + \log{\left( y^{-1}\right)} =\) \(\log(x) - \log(y)\), and thus it also holds if \(x\) and \(y\) are positive, but may not hold in general.

Chúng ta cũng thấy rằng \(\log{\left( e^x \right)} = x\) đến từ \(\log{\left( e^x \right)} = x\log(e) = x\), and thus holds when \(x\) is real (and it can be verified that it does not hold in general for arbitrary complex \(x\), for example, \(\log{\left(e^{x + 2\pi i}\right)} = \log{\left(e^x\right)} = x \neq x + 2\pi i\)).

expand_log#

Để áp dụng danh tính 1 và 2 từ trái sang phải, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
32. Như mọi khi, danh tính sẽ không được áp dụng trừ khi chúng hợp lệ

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
47

Như với

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
14 và
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
25,
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
32 có tùy chọn
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
36 có thể được sử dụng để bỏ qua các giả định

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
48

logcombine#

Để áp dụng danh tính 1 và 2 từ phải sang trái, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
37

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
49

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
37 cũng có tùy chọn
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
36 có thể được sử dụng để bỏ qua các giả định

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
80

Chức năng đặc biệt#

SymPy thực hiện hàng chục chức năng đặc biệt, từ các chức năng trong tổ hợp đến vật lý toán học

Danh sách đầy đủ các chức năng đặc biệt có trong SymPy và tài liệu của chúng có tại trang Mô-đun chức năng .

Với mục đích của hướng dẫn này, hãy giới thiệu một số chức năng đặc biệt trong SymPy

Hãy xác định

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
05,
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
06 và
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
09 là các Ký hiệu thông thường, phức tạp, loại bỏ mọi giả định mà chúng ta đã đặt cho chúng trong phần trước. Chúng tôi cũng sẽ xác định
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
43,
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
44 và
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
45

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
81

Hàm giai thừa là

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
46.
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
47 đại diện cho \(n. = 1\cdot2\cdots(n - 1)\cdot n\) . \(n. \) đại diện cho số hoán vị của \(n\) mục riêng biệt.

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
82

Hàm hệ số nhị thức là

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
48.
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
49 đại diện cho \(\binom{n}{k}\) , số cách chọn \( . Nó cũng thường được viết là items from a set of \(n\) distinct items. It is also often written as \(nCk\) , và được phát âm là “ \(n\) choose \(k\)”.

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
83

Hàm giai thừa có liên quan chặt chẽ với hàm gamma,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
50.
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
51 đại diện cho \(\Gamma(z) = \int_0^\infty t^{z - 1}e^{-t}\,dt\), which for positive integer \(z\) is the same as \((z - 1)!\) .

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
84

Hàm siêu hình học tổng quát là

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
52.
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
53 đại diện cho \({}_pF_q\left(\begin{matrix} a_1, \cdots, a_p \\ b_1, \cdots, b_q \end{matrix} \middle. z \right)\) . Trường hợp phổ biến nhất là \({}_2F_1\) , thường được gọi là hàm siêu hình thông thường.

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
85

viết lại#

Một cách phổ biến để giải quyết các chức năng đặc biệt là viết lại chúng theo cách của nhau. Điều này hoạt động với bất kỳ chức năng nào trong SymPy, không chỉ các chức năng đặc biệt. Để viết lại một biểu thức dưới dạng hàm, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
54. Ví dụ,

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
86

Để biết một số mẹo về việc áp dụng viết lại có mục tiêu hơn, hãy xem phần Thao tác biểu thức nâng cao .

expand_func#

Để mở rộng các chức năng đặc biệt về một số danh tính, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
55. Ví dụ

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
87

siêu mở rộng#

Để viết lại

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
52 dưới dạng các chức năng tiêu chuẩn hơn, hãy sử dụng
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
57

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
88

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
57 cũng hoạt động trên chức năng Meijer G tổng quát hơn (xem
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
59 để biết thêm thông tin)

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
89

lược #

Để đơn giản hóa các biểu thức tổ hợp, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
60

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
00

gammasimp#

Để đơn giản hóa các biểu thức với hàm gamma hoặc hàm tổ hợp với đối số không nguyên, hãy sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
61

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
01

Thí dụ. Tiếp Phân Số#

Hãy sử dụng SymPy để khám phá các phân số tiếp tục. Một phân số liên tục là một biểu thức của hình thức

\[a_0 + \cfrac{1}{a_1 + \cfrac{1}{a_2 + \cfrac{1}{ \ddots + \cfrac{1}{a_n} }}}\]

trong đó \(a_0, \ldots, a_n\) là số nguyên và \(a_1 . Một phân số liên tục cũng có thể là vô hạn, nhưng các đối tượng vô hạn khó biểu diễn hơn trong máy tính, vì vậy chúng ta sẽ chỉ xem xét trường hợp hữu hạn ở đây. are positive. A continued fraction can also be infinite, but infinite objects are more difficult to represent in computers, so we will only examine the finite case here.

Một phân số tiếp diễn của dạng trên thường được biểu diễn dưới dạng danh sách \([a_0; a_1, \ldots, a_n]\) . Hãy viết một hàm đơn giản để chuyển đổi một danh sách như vậy sang dạng phân số tiếp tục của nó. Cách dễ nhất để xây dựng một phân số liên tục từ một danh sách là làm ngược lại. Lưu ý rằng bất chấp sự đối xứng rõ ràng của định nghĩa, phần tử đầu tiên, \(a_0\) , thường phải được xử lý khác với phần còn lại.

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
02

Chúng tôi sử dụng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
62 trong
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
63 để kết quả sẽ luôn là một đối tượng SymPy, ngay cả khi chúng tôi chỉ chuyển vào Python ints

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
03

Mỗi phân số tiếp tục hữu hạn là một số hữu tỷ, nhưng chúng tôi quan tâm đến các ký hiệu ở đây, vì vậy hãy tạo một phân số tiếp tục ký hiệu. Hàm

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
04 mà chúng tôi đang sử dụng có phím tắt để tạo các ký hiệu được đánh số. _______ 165 sẽ tạo ra các ký hiệu ________ 166, ________ 167, …, ________ 168

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
04

Biểu mẫu này hữu ích để hiểu các phân số liên tục, nhưng hãy đặt nó ở dạng hàm hữu tỷ tiêu chuẩn bằng cách sử dụng

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
59

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
05

Bây giờ, giả sử chúng ta đã nhận được

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
70 ở dạng hủy bỏ ở trên. Trên thực tế, chúng ta có thể được cung cấp phân số ở bất kỳ dạng nào, nhưng chúng ta luôn có thể đặt nó ở dạng chính tắc ở trên với
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
59. Giả sử rằng chúng ta biết rằng nó có thể được viết lại dưới dạng một phân số liên tục. Làm thế nào chúng ta có thể làm điều này với SymPy? . Nếu chúng ta có thể viết biểu thức ở dạng này, chúng ta có thể rút ra từng \(c + \frac{1}{f}\), where \(c\) is an integer and \(f\) is a (smaller) continued fraction. If we could write the expression in this form, we could pull out each \(c\) theo cách đệ quy và thêm nó vào danh sách. Sau đó, chúng ta có thể nhận được một phân số liên tục với hàm
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
72 của mình.

Quan sát chính ở đây là chúng ta có thể chuyển đổi một biểu thức sang dạng \(c + \frac{1}{f}\) by doing a partial fraction decomposition with respect to \(c\). This is because \(f\) không chứa \(c\). This means we need to use the

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
73 function. We use
>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
73 to pull the term out, then subtract it from the expression, and take the reciprocal to get the \(f\) .

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
06

Bây giờ chúng tôi lặp lại quá trình này

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
07

Tất nhiên, bài tập này có vẻ vô nghĩa, bởi vì chúng ta đã biết rằng

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
70 của chúng ta là
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
76. Vì vậy, hãy thử bài tập sau. Lấy một danh sách các ký hiệu và ngẫu nhiên hóa chúng, đồng thời tạo phân số tiếp tục bị hủy và xem liệu bạn có thể tạo lại danh sách ban đầu không. Ví dụ

>>> factor_list(x**2*z + 4*x*y*z + 4*y**2*z)
(1, [(z, 1), (x + 2⋅y, 2)])
08

Trong SymPy, trong ví dụ trên, hãy thử tạo lại

>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
77 từ
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
70. Tôi đã xóa
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
77 ở cuối để loại bỏ sự cám dỗ của việc nhìn trộm (bạn có thể kiểm tra câu trả lời của mình ở cuối bằng cách gọi
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
80 trong danh sách mà bạn tạo ở cuối và so sánh nó với
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> simplify(gamma(x)/gamma(x - 2))
(x - 2)⋅(x - 1)
81