NumPy. Giải hệ phương trình tuyến tính
Đầu tiên chúng ta xem xét một hệ phương trình tuyến tính với hai biến $x$ và $y$
Chúng tôi chọn một ví dụ từ văn bản cổ điển của Hall & Knight Đại số sơ cấp 1
$$ 3x + 7y = 27 \\ 5x + 2y = 16 $$
Điều này có thể được đặt ở dạng sản phẩm chấm ma trận như
$$ \begin{bmatrix} 3 & 7 \\ 5 & 2 \\ \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ \end{bmatrix} = \begin{bmatrix} 27 \\ 16
Nếu $A$ đại diện cho ma trận các hệ số, $x$ vectơ cột biến và $B$ vectơ cột nghiệm thì phương trình trên có thể rút gọn thành
$$ Trục = B $$
Tích ma trận trên sẽ được xác định khi và chỉ khi số cột trong ma trận hệ số $A$ bằng số hàng trong ma trận biến $x$
Ở trường, hầu hết chúng ta đều quen thuộc với việc giải các tập hợp phương trình tuyến tính như vậy bằng Quy tắc Cramer, liên quan đến các yếu tố quyết định.
Thư viện số của Python NumPy có hàm
[2. 3.]
82 giải phương trình ma trận tuyến tính hoặc hệ phương trình vô hướng tuyến tínhỞ đây chúng tôi tìm thấy giải pháp cho tập hợp các phương trình trên trong Python bằng cách sử dụng NumPy's numpy. linalg. hàm giải quyết []
import numpy as np
a = np.array[[[3,7], [5,2]]]
b = np.array[[27,16]]
x = np.linalg.solve[a, b]
print[x]
Nếu đoạn script Python trên được thực thi, ta sẽ nhận được nghiệm ở dạng ma trận cột như
[2. 3.]
đại diện cho các giá trị $x$ và $y$ tương ứng. Vì vậy, $x = 2$ và $y = 3$
Ngoài ra bạn có thể dùng hàm
[2. 3.]
83 để kiểm tra xem lời giải đã đúng chưa. Sau đây sẽ trả về
[2. 3.]
84
np.allclose[np.dot[a, x], b]
Tiếp theo, chúng tôi xem xét các phương trình đồng thời trong ba ẩn số hoặc biến $x$ , $y$ và $z$. Chúng tôi chọn một ví dụ khác từ cùng một cuốn sách Elementary Algebra2 của Hall & Knight
$$ 6x + 2y - 5z = 13 \\ 3x + 3y - 2z = 13 \\ 7x + 5y - 3z = 26 $$
Ta biểu diễn các phương trình trên dưới dạng ma trận
$$ \begin{bmatrix} 6 & 2 & -5 \\ 3 & 3 & -2 \\ 7 & 5 & -3 \\ \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ z
Chúng tôi giải quyết nó bằng hàm
[2. 3.]
82 của NumPy
import numpy as np
a = np.array[[[6,2,-5], [3,3,-2], [7,5,-3]]]
b = np.array[[13,13,26]]
x = np.linalg.solve[a, b]
print[x]
Khi thực thi tập lệnh, giải pháp được in dưới dạng ma trận cột, biểu thị các giá trị tương ứng cho $x$ , $y$ và $z$
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 là một hàm tổng quát cũ hơn để giải nhiều loại phương trình.
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 có nhiều tùy chọn và sử dụng các phương pháp khác nhau trong nội bộ để xác định loại phương trình nào bạn vượt qua nó, vì vậy nếu bạn biết loại phương trình bạn đang xử lý, bạn có thể muốn sử dụng
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]9 mới hơn để giải phương trình một biến,
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}0 để giải hệ phương trình tuyến tính.
Phương trình đại số#
Sử dụng
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 để giải các phương trình đại số. Chúng tôi giả sử tất cả các phương trình đều bằng 0, vì vậy việc giải x**2 == 1 chuyển thành mã sau
[2. 3.]
0Đối số đầu tiên cho
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 là một phương trình [bằng 0] và đối số thứ hai là ký hiệu mà chúng ta muốn giải phương trình chosympy. người giải quyết. người giải quyết. giải quyết[f , *symbols, **flags][source]#
Đại số giải phương trình và hệ phương trình
Thông số .f
một Expr hoặc Poly duy nhất phải bằng không
bình đẳng
một biểu thức quan hệ
một Boolean
iterable của một hoặc nhiều ở trên
biểu tượng. [đối tượng để giải quyết] được chỉ định là
không đưa ra [các đối tượng không phải là số khác sẽ được sử dụng]
biểu tượng duy nhất
danh sách dày đặc của các ký hiệu [e. g. ,
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}4]có thể lặp lại theo thứ tự các ký hiệu [e. g. ,
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}5]
cờ
dict=True [mặc định là Sai]
Danh sách trả về [có thể trống] của ánh xạ giải pháp
set=True [mặc định là Sai]Trả về danh sách các ký hiệu và tập hợp [các] bộ của [các] giải pháp
loại trừ=[] [mặc định]Đừng cố gắng giải quyết bất kỳ biểu tượng miễn phí nào trong số các biểu tượng bị loại trừ;
check=True [mặc định]Nếu Sai, không thực hiện bất kỳ thử nghiệm nào đối với các giải pháp. Điều này có thể hữu ích nếu bạn muốn bao gồm các giải pháp làm cho mọi mẫu số bằng không
số=True [mặc định]Thực hiện kiểm tra số nhanh nếu f chỉ có một ký hiệu
tối thiểu=True [mặc định là Sai]Một thử nghiệm rất nhanh, tối thiểu
cảnh báo=True [mặc định là Sai]Hiển thị cảnh báo nếu
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}6 không thể kết luậnđơn giản hóa=True [mặc định]Rút gọn tất cả trừ đa thức bậc 3 trở lên trước khi trả về chúng và [nếu kiểm tra không sai] sử dụng hàm đơn giản hóa tổng quát trên các nghiệm và biểu thức thu được khi chúng được thay thế vào hàm phải bằng 0
force=True [mặc định là Sai]Làm cho tất cả các ký hiệu tích cực mà không có giả định về dấu hiệu
hợp lý=True [mặc định]Recast Floats như Rational; . Nếu hợp lý=Không, Floats sẽ được viết lại dưới dạng số hữu tỷ nhưng câu trả lời sẽ được viết lại dưới dạng Floats. Nếu cờ là Sai thì sẽ không có gì được thực hiện với Phao
manual=True [mặc định là Sai]Không sử dụng phương pháp polys/ma trận để giải một hệ phương trình, hãy giải chúng lần lượt như cách bạn có thể “làm thủ công”. ”
ngầm định=True [mặc định là Sai]Cho phép
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}7 trả về giải pháp cho một mẫu theo các chức năng khác có chứa mẫu đó; cụ thể=True [mặc định là Sai]Hướng dẫn
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}7 cố gắng tìm một giải pháp cụ thể cho một hệ thống tuyến tính có càng nhiều số 0 càng tốt; quick=True [mặc định là Sai;>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}9 phải là Đúng]Chọn một phương pháp phỏng đoán nhanh để tìm ra giải pháp có nhiều số 0 trong khi giá trị Sai sử dụng phương pháp rất chậm được đảm bảo để tìm ra số không lớn nhất có thể
khối = Đúng [mặc định]Trả về các giải pháp rõ ràng khi gặp biểu thức bậc ba. Khi Sai, quartics và quintics cũng bị vô hiệu hóa
quartics=True [mặc định]Trả về các giải pháp rõ ràng khi gặp các biểu thức quartic. Khi Sai, quintics cũng bị vô hiệu hóa
quintics=True [mặc định]Trả về các giải pháp rõ ràng [nếu có thể] khi gặp các biểu thức tinh túy
Giải trình
Hiện đang được hỗ trợđa thức
siêu việt
sự kết hợp từng phần của những điều trên
hệ phương trình tuyến tính và đa thức
hệ thống chứa các biểu thức quan hệ
ví dụ
Đầu ra thay đổi tùy theo đầu vào và có thể được nhìn thấy bằng ví dụ
[2. 3.]
8Boolean hoặc đơn biến Quan hệ
[2. 3.]
9Để luôn nhận danh sách ánh xạ giải pháp, hãy sử dụng cờ dict=True
np.allclose[np.dot[a, x], b]
0Để có danh sách các ký hiệu và tập hợp [các] giải pháp, hãy sử dụng cờ set=True
np.allclose[np.dot[a, x], b]
1Biểu thức đơn và ký hiệu đơn có trong biểu thức
np.allclose[np.dot[a, x], b]
2Biểu thức đơn lẻ không có ký hiệu trong biểu thức
np.allclose[np.dot[a, x], b]
3Biểu thức đơn không có biểu tượng nào được đưa ra. Trong trường hợp này, tất cả các biểu tượng miễn phí sẽ được chọn làm biểu tượng tiềm năng để giải quyết. Nếu phương trình là đơn biến thì một danh sách các nghiệm được trả về;
np.allclose[np.dot[a, x], b]
4Khi một đối tượng không phải là Ký hiệu được đưa ra làm ký hiệu, nó được cô lập về mặt đại số và có thể thu được nghiệm ẩn. Điều này chủ yếu được cung cấp như một sự tiện lợi để giúp bạn không phải thay thế đối tượng bằng một Biểu tượng và giải quyết Biểu tượng đó. Nó sẽ chỉ hoạt động nếu đối tượng được chỉ định có thể được thay thế bằng Biểu tượng bằng phương thức phụ
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}
Để giải quyết một biểu tượng hoàn toàn, hãy sử dụng implicit=True
80[2. 3.]
Có thể giải quyết bất cứ điều gì có thể được nhắm mục tiêu với người đăng ký
81[2. 3.]
Không có gì anh hùng được thực hiện trong giải pháp ngầm này, vì vậy bạn có thể kết thúc với một biểu tượng vẫn còn trong giải pháp
82[2. 3.]
Nếu bạn cố gắng giải một số, hãy nhớ rằng số bạn nhận được không nhất thiết có nghĩa là giá trị tương đương với biểu thức thu được
83[2. 3.]
Để giải một hàm trong một đạo hàm, hãy sử dụng
800[2. 3.]
Một biểu thức và nhiều hơn một ký hiệu
Khi có nghiệm tuyến tính
84[2. 3.]
Khi các hệ số không xác định được xác định
đó là tuyến tính
85[2. 3.]
Đó là phi tuyến tính
86[2. 3.]
Nếu không có giải pháp tuyến tính, thì lần thử thành công đầu tiên cho giải pháp phi tuyến tính sẽ được trả về
87[2. 3.]
Có thể lặp lại một hoặc nhiều điều trên
Liên quan đến quan hệ hoặc bool
88[2. 3.]
Khi hệ thống tuyến tính
Với một giải pháp
89[2. 3.]
Không có giải pháp
90[2. 3.]
Khi hệ thống không tuyến tính
91[2. 3.]
Nếu không có biểu tượng nào được cung cấp, tất cả các biểu tượng miễn phí sẽ được chọn và một danh sách ánh xạ được trả về
92[2. 3.]
Nếu bất kỳ phương trình nào không phụ thuộc vào [các] ký hiệu đã cho, nó sẽ bị loại khỏi tập phương trình và một câu trả lời có thể được đưa ra một cách ngầm định dưới dạng các biến không được quan tâm
93[2. 3.]
Ví dụ bổ sung
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 với check=True [mặc định] sẽ chạy qua các thẻ biểu tượng để loại bỏ các giải pháp không mong muốn. Nếu không có giả định nào được đưa vào, tất cả các giải pháp khả thi sẽ được trả về
[2. 3.]
94Bằng cách sử dụng thẻ tích cực, chỉ một giải pháp sẽ được trả về
[2. 3.]
95Giả định không được kiểm tra khi đầu vào
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]7 liên quan đến quan hệ hoặc bool
Khi các giải pháp được kiểm tra, những giải pháp làm cho bất kỳ mẫu số nào bằng 0 sẽ tự động bị loại trừ. Nếu bạn không muốn loại trừ các giải pháp như vậy, thì hãy sử dụng tùy chọn check=False
[2. 3.]
96Nếu check=False thì tìm được nghiệm cho tử số bằng 0. x = 0. Trong trường hợp này, đây là nghiệm giả vì \[\sin[x]/x\] có giới hạn đã biết [không gián đoạn] là 1 .
[2. 3.]
97Tuy nhiên, trong trường hợp sau, giới hạn tồn tại và bằng giá trị của x = 0 bị loại trừ khi check=True
[2. 3.]
98Vô hiệu hóa các giải pháp rõ ràng bậc cao
Khi giải các biểu thức đa thức, bạn có thể không muốn các giải pháp rõ ràng [có thể khá dài]. Nếu biểu thức là đơn biến, thay vào đó, các phiên bản
[2. 3.]
803 sẽ được trả về
[2. 3.]
99Nếu biểu thức là đa biến, không có giải pháp nào có thể được trả về
np.allclose[np.dot[a, x], b]
00Đôi khi các giải pháp sẽ thu được ngay cả khi cờ là Sai vì biểu thức có thể được đưa vào hệ số. Trong ví dụ sau, phương trình có thể được phân tích thành nhân tử là tích của một thừa số tuyến tính và bậc hai để thu được các nghiệm rõ ràng [không yêu cầu giải biểu thức bậc ba]
np.allclose[np.dot[a, x], b]
01Giải phương trình liên quan đến căn
Do SymPy sử dụng nghiệm nguyên tắc, một số nghiệm của phương trình nghiệm căn sẽ bị bỏ sót trừ khi check=False
np.allclose[np.dot[a, x], b]
02Trong ví dụ trên, chỉ có một nghiệm duy nhất cho phương trình. Các biểu thức khác sẽ tạo ra các gốc giả phải được kiểm tra thủ công;
np.allclose[np.dot[a, x], b]
03Nghiệm đầu tiên là âm nên phải dùng
[2. 3.]
804 để thấy rằng nó thỏa mãn biểu thức
np.allclose[np.dot[a, x], b]
04Nếu nghiệm của phương trình không có thực thì cần phải cẩn thận hơn để tìm nghiệm, đặc biệt đối với phương trình bậc cao. Xét biểu thức sau
np.allclose[np.dot[a, x], b]
05Chúng ta sẽ xây dựng một giá trị đã biết cho biểu thức này tại x = 3 bằng cách chọn căn bậc 1 cho mỗi căn
np.allclose[np.dot[a, x], b]
06Hàm
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}7 không thể tìm thấy bất kỳ gốc chính xác nào của phương trình này
np.allclose[np.dot[a, x], b]
07Tuy nhiên, hàm
[2. 3.]
806 có thể được sử dụng để lấy dạng phương trình có thể tìm được các nghiệm số
np.allclose[np.dot[a, x], b]
08Mặc dù có thể sử dụng
[2. 3.]
807 hoặc
[2. 3.]
808 để tìm
[2. 3.]
809, giải pháp chỉ có thể được xác minh bằng
[2. 3.]
810
np.allclose[np.dot[a, x], b]
09Xem thêm
[2. 3.]
811Để giải quyết các mối quan hệ lặp lại
[2. 3.]
800Để giải phương trình vi phân
sympy. người giải quyết. người giải quyết. solve_linear[lhs , rhs=0, symbols=[], exclude=[]][source]#Trả về một tuple có nguồn gốc từ
[2. 3.]
813 là một trong những điều sau đây.
[2. 3.]
814,
[2. 3.]
815,
[2. 3.]
816,
[2. 3.]
817Giải trình
[2. 3.]
814 có nghĩa là
[2. 3.]
819 độc lập với các ký hiệu trong các ký hiệu không bị loại trừ
[2. 3.]
815 có nghĩa là không có giải pháp cho phương trình trong số các ký hiệu đã cho. Nếu phần tử đầu tiên của bộ dữ liệu khác không, thì hàm được đảm bảo phụ thuộc vào một ký hiệu trong các ký hiệu
[2. 3.]
816 trong đó ký hiệu xuất hiện tuyến tính trong tử số của
[2. 3.]
819, nằm trong ký hiệu [nếu được cung cấp] và không bị loại trừ [nếu được cung cấp]. Không đơn giản hóa nào được thực hiện cho
[2. 3.]
819 ngoài việc mở rộng
[2. 3.]
824, vì vậy giải pháp sẽ hoàn toàn tương ứng với một giải pháp duy nhất
[2. 3.]
817 trong đó
[2. 3.]
826 và
[2. 3.]
827 là tử số và mẫu số của
[2. 3.]
819 khi tử số không tuyến tính trong bất kỳ biểu tượng quan tâm nào; ví dụ
np.allclose[np.dot[a, x], b]
10
[2. 3.]
819 độc lập với các ký hiệu trong các ký hiệu không bị loại trừ
np.allclose[np.dot[a, x], b]
11Biến
[2. 3.]
831 xuất hiện dưới dạng biến tuyến tính trong mỗi trường hợp sau
np.allclose[np.dot[a, x], b]
12Khi không tuyến tính trong
[2. 3.]
831 hoặc
[2. 3.]
833 thì tử số và mẫu số được trả về
np.allclose[np.dot[a, x], b]
13Nếu tử số của biểu thức là một ký hiệu, thì _____1815 được trả về nếu giải pháp cho ký hiệu đó sẽ đặt bất kỳ mẫu số nào thành 0
np.allclose[np.dot[a, x], b]
14Nhưng việc viết lại tự động có thể khiến một ký hiệu ở mẫu số xuất hiện ở tử số nên sẽ trả về đáp án
np.allclose[np.dot[a, x], b]
15Sử dụng một biểu thức chưa được đánh giá để tránh điều này
np.allclose[np.dot[a, x], b]
16Nếu
[2. 3.]
831 được phép triệt tiêu trong biểu thức sau, thì nó có vẻ là tuyến tính trong
[2. 3.]
831, nhưng loại hủy bỏ này không được thực hiện bởi
[2. 3.]
837, vì vậy giải pháp sẽ luôn thỏa mãn biểu thức ban đầu mà không gây ra lỗi chia cho 0
np.allclose[np.dot[a, x], b]
17Có thể đưa ra danh sách các biểu tượng mà giải pháp mong muốn
np.allclose[np.dot[a, x], b]
18Một danh sách các biểu tượng để bỏ qua cũng có thể được đưa ra
np.allclose[np.dot[a, x], b]
19[Nhận được giải pháp cho
[2. 3.]
833 vì đây là biến đầu tiên từ danh sách các ký hiệu được sắp xếp theo quy tắc có giải pháp tuyến tính. ]sympy. người giải quyết. người giải quyết. solve_linear_system[hệ thống , *symbols, **flags][source]#Giải hệ phương trình tuyến tính \[N\] với \[M\] variables, which means both under- and overdetermined systems are supported.
Giải trình
Số lượng giải pháp có thể là không, một hoặc vô hạn. Tương ứng, quy trình này sẽ trả về Không có hoặc một từ điển có giải pháp. Trong trường hợp hệ thống chưa được xác định, tất cả các tham số tùy ý đều bị bỏ qua. Điều này có thể gây ra tình huống trong đó một từ điển trống được trả về. Trong trường hợp đó, tất cả các ký hiệu có thể được gán giá trị tùy ý
Đầu vào của hàm này là ma trận \[N\times M + 1\] , có nghĩa là nó phải ở dạng tăng cường. Nếu bạn muốn nhập phương trình \[N\] và \[M\] unknowns then use
[2. 3.]
839 instead. Note: a local copy of the matrix is made by this routine so the matrix that is passed will not be modified.Thuật toán được sử dụng ở đây là loại bỏ Gaussian không có phân số, kết quả là, sau khi loại bỏ, trong một ma trận tam giác trên. Sau đó, các giải pháp được tìm thấy bằng cách thay thế ngược. Cách tiếp cận này hiệu quả và nhỏ gọn hơn so với phương pháp Gauss-Jordan
ví dụ
np.allclose[np.dot[a, x], b]
20Giải hệ phương trình sau
np.allclose[np.dot[a, x], b]
21
np.allclose[np.dot[a, x], b]
22Một hệ thống suy biến trả về một từ điển trống
np.allclose[np.dot[a, x], b]
23sympy. người giải quyết. người giải quyết. solve_linear_system_LU[ma trận , biểu tượng][source]#Giải hệ thống ma trận tăng cường bằng cách sử dụng
[2. 3.]
840 và trả về một từ điển trong đó các giải pháp được khóa vào các ký hiệu của sym theo thứ tựGiải trình
Ma trận phải khả nghịch
ví dụ
np.allclose[np.dot[a, x], b]
24
np.allclose[np.dot[a, x], b]
25Xem thêm
[2. 3.]
840sympy. người giải quyết. người giải quyết. solve_untermined_coeffs[equ , coeffs, sym, **flags][source]#Giải phương trình loại \[p[x; a_1, \ldots, a_k] = q[x]\] trong đó cả hai . \[p\] and \[q\] are univariate polynomials that depend on \[k\] parameters.
Giải trình
Kết quả của hàm này là một từ điển với các giá trị tượng trưng của các tham số đó đối với các hệ số trong \[q\] .
Hàm này chấp nhận cả các thể hiện của lớp phương trình và các biểu thức SymPy thông thường. Đặc điểm kỹ thuật của các tham số và biến là bắt buộc vì lý do hiệu quả và đơn giản
ví dụ
np.allclose[np.dot[a, x], b]
26
np.allclose[np.dot[a, x], b]
27
np.allclose[np.dot[a, x], b]
28sympy. người giải quyết. người giải quyết. nsolve[*args , dict=False, **kwargs][source]#Giải hệ phương trình phi tuyến bằng số.
[2. 3.]
842Giải trình
[2. 3.]
819 là một hàm vectơ của các biểu thức ký hiệu đại diện cho hệ thống. args là các biến. Nếu chỉ có một biến, đối số này có thể được bỏ qua.
[2. 3.]
844 là véc tơ xuất phát gần nghiệmSử dụng từ khóa mô-đun để chỉ định mô-đun nào sẽ được sử dụng để đánh giá chức năng và ma trận Jacobian. Đảm bảo sử dụng mô-đun hỗ trợ ma trận. Để biết thêm thông tin về cú pháp, vui lòng xem chuỗi tài liệu của
[2. 3.]
845Nếu các đối số từ khóa chứa
[2. 3.]
846 [mặc định là Sai] thì
[2. 3.]
847 sẽ trả về một danh sách [có thể trống] các ánh xạ giải pháp. Điều này có thể đặc biệt hữu ích nếu bạn muốn sử dụng
[2. 3.]
847 làm dự phòng để giải quyết vì sử dụng đối số dict cho cả hai phương thức sẽ tạo ra các giá trị trả về có cấu trúc kiểu nhất quán. Xin lưu ý. để giữ điều này nhất quán với >>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}7, giải pháp sẽ được trả về trong một danh sách mặc dù
[2. 3.]
847 [ít nhất hiện tại] chỉ tìm thấy một giải pháp tại một thời điểmHệ thống xác định quá mức được hỗ trợ
ví dụ
np.allclose[np.dot[a, x], b]
29Đối với các hàm một chiều, cú pháp được đơn giản hóa
np.allclose[np.dot[a, x], b]
30Để giải quyết với độ chính xác cao hơn mặc định, hãy sử dụng đối số prec
np.allclose[np.dot[a, x], b]
31Để giải quyết các nghiệm phức của các hàm thực, một điểm ban đầu không thực phải được chỉ định
np.allclose[np.dot[a, x], b]
32
[2. 3.]
851 được sử dụng và bạn có thể tìm tài liệu mở rộng hơn của họ, đặc biệt liên quan đến tham số từ khóa và bộ giải có sẵn. Tuy nhiên, lưu ý rằng các chức năng rất dốc gần gốc, việc xác minh giải pháp có thể thất bại. Trong trường hợp này, bạn nên sử dụng cờ
[2. 3.]
852 và xác minh độc lập giải pháp
np.allclose[np.dot[a, x], b]
33Người ta có thể bỏ qua xác minh một cách an toàn nếu biết giới hạn của gốc và sử dụng phương pháp chia đôi
np.allclose[np.dot[a, x], b]
34Ngoài ra, một chức năng có thể hoạt động tốt hơn khi bỏ qua mẫu số. Tuy nhiên, vì điều này không phải lúc nào cũng đúng, nên việc quyết định sử dụng chức năng nào là do người dùng quyết định
np.allclose[np.dot[a, x], b]
35sympy. người giải quyết. người giải quyết. checksol[f , ký hiệu, sol=None, **flags][source]#Kiểm tra xem sol có phải là nghiệm của phương trình f == 0
Giải trình
Đầu vào có thể là một ký hiệu và giá trị tương ứng hoặc một từ điển các ký hiệu và giá trị. Khi được cung cấp dưới dạng từ điển và gắn cờ
[2. 3.]
853, các giá trị trong từ điển sẽ được đơn giản hóa. f có thể là một phương trình duy nhất hoặc một phương trình lặp lại. Một giải pháp phải đáp ứng tất cả các phương trình trong f để được coi là hợp lệ; ví dụ
np.allclose[np.dot[a, x], b]
36Để kiểm tra xem một biểu thức có bằng 0 hay không bằng cách sử dụng
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}6, hãy chuyển nó thành f và gửi một từ điển trống cho biểu tượng
np.allclose[np.dot[a, x], b]
37Không có gì được trả lại nếu
>>> from sympy import Indexed, IndexedBase, Tuple, sqrt >>> A = IndexedBase['A'] >>> eqs = Tuple[A[1] + A[2] - 3, A[1] - A[2] + 1] >>> solve[eqs, eqs.atoms[Indexed]] {A[1]: 1, A[2]: 2}6 không thể kết luậncờ. 'số=True [mặc định]'
kiểm tra số nhanh nếu
[2. 3.]
819 chỉ có một ký hiệu'tối thiểu=True [mặc định là Sai]'một thử nghiệm rất nhanh, tối thiểu
'cảnh báo = Đúng [mặc định là Sai]'hiển thị cảnh báo nếu checksol[] không thể kết luận
'đơn giản hóa=True [mặc định]'đơn giản hóa giải pháp trước khi thay thế vào chức năng và đơn giản hóa chức năng trước khi thử đơn giản hóa cụ thể
'lực lượng = Đúng [mặc định là Sai]'làm cho tất cả các ký hiệu tích cực mà không có giả định về dấu hiệu
sympy. người giải quyết. người giải quyết. unrad[eq , *syms, **flags][source]#Loại bỏ các gốc bằng các đối số tượng trưng và trả về [eq, cov], Không có hoặc đưa ra lỗi
Giải trình
Không có gì được trả lại nếu không có gốc để loại bỏ
NotImplementedError được nâng lên nếu có các gốc và chúng không thể bị loại bỏ hoặc nếu mối quan hệ giữa các ký hiệu ban đầu và sự thay đổi của biến cần thiết để viết lại hệ thống dưới dạng đa thức không thể giải được
Mặt khác, bộ dữ liệu,
[2. 3.]
857, được trả về ở đâueq,
[2. 3.]
858eq là một phương trình không có căn [trong [các] ký hiệu quan tâm] có các nghiệm là tập hợp lớn nhất của các nghiệm của biểu thức ban đầu. eq có thể được viết lại theo một biến mới; . Ví dụ: đối với sqrt[2 - x], bộ giá trị sẽ là
[2. 3.]
864. Các nghiệm của eq sẽ chứa nghiệm của phương trình ban đầu [nếu có]ký hiệuMột biểu tượng có thể lặp lại, nếu được cung cấp, sẽ hạn chế trọng tâm của việc loại bỏ triệt để. chỉ những gốc có một hoặc nhiều biểu tượng quan tâm mới bị xóa. Tất cả các biểu tượng miễn phí được sử dụng nếu syms không được đặt
cờ được sử dụng nội bộ để liên lạc trong các cuộc gọi đệ quy. Hai tùy chọn cũng được công nhận
865, khi được xác định, được hiểu là hàm một đối số trả về True nếu xử lý một Pow nhất định[2. 3.]
Các gốc có thể được loại bỏ khỏi một biểu thức nếu
Tất cả các cơ sở của các gốc là như nhau;
Nếu tất cả các gốc xuất hiện trong một thuật ngữ của biểu thức
Chỉ có bốn số hạng có thừa số sqrt[] hoặc có ít hơn bốn số hạng có thừa số sqrt[]
Chỉ có hai thuật ngữ với gốc tự do
ví dụ
np.allclose[np.dot[a, x], b]
38
np.allclose[np.dot[a, x], b]
39Phương trình vi phân thông thường [ODE]#
Xem ODE .
Phương trình đạo hàm riêng [PDE]#
Xem PDE .
Deutils [Tiện ích giải ODE và PDE]#
sympy. người giải quyết. deutils. ode_order[expr , func][source]#Trả về thứ tự của một phương trình vi phân đã cho đối với hàm
Chức năng này được thực hiện đệ quy
ví dụ
np.allclose[np.dot[a, x], b]
40Phương trình truy hồi #
sympy. người giải quyết. tái phát. rsolve[f , y, init=None][source]#Giải bài toán truy hồi đơn biến với hệ số hữu tỉ
Cho trước \[k\] truy hồi tuyến tính bậc thứ \[\operatorname{L} . , or equivalently:
\[a_{k}[n] y[n+k] + a_{k-1}[n] y[n+k-1] + \cdots + a_{0}[n] y[n] = f
ở đâu \[a_{i}[n]\] , cho \[i= . , are polynomials or rational functions in \[n\], and \[f\] is a hypergeometric function or a sum of a fixed number of pairwise dissimilar hypergeometric terms in \[n\], finds all solutions or returns
[2. 3.]
866, if none were found.Các điều kiện ban đầu có thể được đưa ra dưới dạng từ điển ở hai dạng
867[2. 3.]
868[2. 3.]
hoặc dưới dạng danh sách
[2. 3.]
869 giá trị870[2. 3.]
ở đâu
[2. 3.]
871, cho \[i=0, \ldots, m\] , ánh xạ tới \[y[n_i]\].ví dụ
Hãy xem xét sự lặp lại sau đây
\[[n - 1] y[n + 2] - [n^2 + 3 n - 2] y[n + 1] + 2 n [n + 1] y[n] = 0\]
np.allclose[np.dot[a, x], b]
41
np.allclose[np.dot[a, x], b]
42
np.allclose[np.dot[a, x], b]
43
np.allclose[np.dot[a, x], b]
44Xem thêm
[2. 3.]
872,
[2. 3.]
873,
[2. 3.]
874sympy. người giải quyết. tái diễn. rsolve_poly[coeffs , f, n, shift=0, **hints][source]#Cho toán tử truy hồi tuyến tính \[\operatorname{L}\] có thứ tự \[k . with polynomial coefficients and inhomogeneous equation \[\operatorname{L} y = f\], where \[f\] is a polynomial, we seek for all polynomial solutions over field \[K\] of characteristic zero.
Thuật toán thực hiện hai bước cơ bản
Tính độ \[N\] của nghiệm đa thức tổng quát.
Tìm tất cả các đa thức bậc \[N\] hoặc nhỏ hơn của \[\operatorname{ . .
Có hai phương pháp tính nghiệm của đa thức. Nếu mức độ ràng buộc là tương đối nhỏ, tôi. e. nó nhỏ hơn hoặc bằng bậc của phép truy hồi, thì phương pháp ngây thơ của các hệ số không xác định đang được sử dụng. Điều này cho hệ phương trình đại số với \[N+1\] ẩn số.
Trường hợp còn lại, thuật toán thực hiện biến đổi phương trình ban đầu thành phương trình tương đương mà hệ phương trình đại số chỉ có \[r\] indeterminates. This method is quite sophisticated [in comparison with the naive one] and was invented together by Abramov, Bronstein and Petkovsek.
Có thể khái quát thuật toán được triển khai ở đây cho trường hợp phương trình vi phân và vi phân q tuyến tính
Giả sử chúng ta muốn tính \[m\] -th đa thức Bernoulli đến một hằng số. Đối với điều này, chúng ta có thể sử dụng \[b[n+1] - b[n] = m n^{m-1}\] lặp lại, có . Ví dụ. \[b[n] = B_m + C\]. For example:
np.allclose[np.dot[a, x], b]
45
np.allclose[np.dot[a, x], b]
46Người giới thiệu
[ R797 ]
S. Một. Abramov, M. Bronstein và M. Petkovsek, Về nghiệm đa thức của phương trình toán tử tuyến tính, trong. t. Cấp độ, biên tập. , Proc. ISSAC '95, ACM Press, New York, 1995, 290-296
[ R798 ]
M. Petkovsek, Các giải pháp siêu hình học của các phép truy hồi tuyến tính với các hệ số đa thức, J. Tính toán tượng trưng, 14 [1992], 243-264
[ R799 ]
Petkovsek, H. S. Wilf, Đ. Zeilberger, A = B, 1996
Cho toán tử truy hồi tuyến tính \[\operatorname{L}\] có thứ tự \[k . with polynomial coefficients and inhomogeneous equation \[\operatorname{L} y = f\], where \[f\] is a polynomial, we seek for all rational solutions over field \[K\] of characteristic zero.
Quy trình này chỉ chấp nhận các đa thức, tuy nhiên, nếu bạn quan tâm đến việc giải quyết truy hồi với các hệ số hữu tỷ thì hãy sử dụng
[2. 3.]
811 sẽ xử lý trước phương trình đã cho và chạy quy trình này với các đối số đa thứcThuật toán thực hiện hai bước cơ bản
Tính đa thức \[v[n]\] có thể dùng làm mẫu số chung của bất kỳ nghiệm hữu tỉ nào của phương trình \[\operatorname{L} y = f\].
Dựng phương trình sai phân tuyến tính mới bằng phép thế \[y[n] = u[n]/v[n]\] và giải . Trả lại
866 nếu không tìm thấy. \[u[n]\] finding all its polynomial solutions. Return[2. 3.]
866 if none were found.[2. 3.]
Thuật toán được triển khai ở đây là phiên bản sửa đổi của thuật toán Abramov ban đầu, được phát triển vào năm 1989. Cách tiếp cận mới đơn giản hơn nhiều để thực hiện và có hiệu quả tổng thể tốt hơn. Phương pháp này có thể dễ dàng áp dụng cho trường hợp phương trình sai phân q
Bên cạnh việc tìm kiếm các giải pháp hợp lý một mình, các chức năng này là một phần quan trọng của thuật toán Hyper vì nó được sử dụng để tìm giải pháp cụ thể cho phần không thuần nhất của một sự lặp lại
ví dụ
np.allclose[np.dot[a, x], b]
47Xem thêm
[2. 3.]
874Người giới thiệu
[ R800 ]
S. Một. Abramov, Nghiệm hợp lý của sai phân tuyến tính và phương trình sai phân q với các hệ số đa thức, trong. t. Cấp độ, biên tập. , Proc. ISSAC '95, ACM Press, New York, 1995, 285-289
sympy. người giải quyết. tái diễn. rsolve_hyper[coeffs , f, n, **hints][source]#Cho toán tử truy hồi tuyến tính \[\operatorname{L}\] có thứ tự \[k . with polynomial coefficients and inhomogeneous equation \[\operatorname{L} y = f\] we seek for all hypergeometric solutions over field \[K\] of characteristic zero.
Phần không đồng nhất có thể là siêu hình học hoặc tổng của một số cố định các thuật ngữ siêu hình học khác nhau theo cặp
Thuật toán thực hiện ba bước cơ bản
Nhóm các thuật ngữ siêu hình học tương tự trong phần không thuần nhất của \[\operatorname{L} y = f\] và tìm nghiệm cụ thể .
Tính toán tập hợp tạo của \[\operatorname{L}\] và tìm cơ sở trong đó để tất cả các nghiệm đều độc lập tuyến tính.
Tạo thành giải pháp cuối cùng với số lượng hằng số tùy ý bằng thứ nguyên của cơ sở của \[\operatorname{L}\] .
Số hạng \[a[n]\] là siêu hình học nếu nó bị triệt tiêu bởi các phương trình sai phân tuyến tính bậc nhất với các hệ số đa thức hoặc, trong .
Đầu ra của thủ tục này là một sự kết hợp tuyến tính của một số thuật ngữ siêu hình học cố định. Tuy nhiên, phương pháp cơ bản có thể tạo ra lớp giải pháp lớn hơn - thuật ngữ D'Alembertian
Cũng lưu ý rằng phương pháp này không chỉ tính toán hạt nhân của phương trình không thuần nhất, mà còn rút gọn thành cơ sở sao cho các nghiệm được tạo bởi quy trình này là độc lập tuyến tính
ví dụ
np.allclose[np.dot[a, x], b]
48
np.allclose[np.dot[a, x], b]
49>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]0
Người giới thiệu
[ R801 ]
M. Petkovsek, Các giải pháp siêu hình học của các phép truy hồi tuyến tính với các hệ số đa thức, J. Tính toán tượng trưng, 14 [1992], 243-264
[ R802 ]
Petkovsek, H. S. Wilf, Đ. Zeilberger, A = B, 1996
Hệ phương trình đa thức#
sympy. người giải quyết. polysys. solve_poly_system[seq , *gens, strict=False, **args][source]#Giải hệ phương trình đa thức
Thông số .tiếp theo. một danh sách/bộ/bộ
Liệt kê tất cả các phương trình cần giải
thị tộc. máy phát điện
trình tạo các phương trình trong seq mà chúng tôi muốn các giải pháp
nghiêm khắc. một boolean [mặc định là Sai]
nếu nghiêm ngặt là Đúng, NotImplementedError sẽ được nêu ra nếu giải pháp được biết là không đầy đủ [điều này có thể xảy ra nếu không phải tất cả các giải pháp đều có thể biểu thị được ở gốc]
tranh luận. Đối số từ khóa
Trả về .Các tùy chọn đặc biệt để giải các phương trình
Danh sách [Tuple]
Một danh sách các bộ dữ liệu. Giải pháp cho các ký hiệu thỏa mãn các phương trình được liệt kê trong seq
ví dụ
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]1
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]2
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]3sympy. người giải quyết. polysys. solve_triangulated[polys , *gens, **args][source]#
Giải hệ đa thức bằng thuật toán Gianni-Kalkbrenner
Thuật toán tiến hành bằng cách tính toán một cơ sở Groebner trong miền cơ sở và sau đó bằng cách tính toán lặp lại các thừa số đa thức trong các phần mở rộng đại số được xây dựng phù hợp của miền cơ sở
Thông số .polys. một danh sách/bộ/bộ
Liệt kê tất cả các phương trình cần giải
thị tộc. máy phát điện
trình tạo các phương trình trong polys mà chúng tôi muốn các giải pháp
tranh luận. Đối số từ khóa
Trả về .Các tùy chọn đặc biệt để giải các phương trình
Danh sách [Tuple]
Một danh sách các bộ dữ liệu. Giải pháp cho các ký hiệu thỏa mãn các phương trình được liệt kê trong polys
ví dụ
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]4
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]5
>>> solve[f[x] - x, f[x]] [x] >>> solve[f[x].diff[x] - f[x] - x, f[x].diff[x]] [x + f[x]] >>> solve[f[x].diff[x] - f[x] - x, f[x]] [-x + Derivative[f[x], x]] >>> solve[x + exp[x]**2, exp[x], set=True] [[exp[x]], {[-sqrt[-x],], [sqrt[-x],]}]6
Người giới thiệu
1. Patrizia Gianni, Teo Mora, Algebraic Solution of System of Polynomial Equations using Groebner Bases, AAECC-5 on Applied Algebra, Algebraic Algorithms and Error-Correcting Codes, LNCS 356 247–257, 1989