Trong bài viết này, bạn sẽ học cách sử dụng Python để tính đại số. Thư viện chính giúp điều này xảy ra là thư viện SymPy
và bạn cũng sẽ học cách sử dụng nó trong bài viết này
Để giải nó bằng số, trước tiên bạn phải mã hóa nó dưới dạng hàm "có thể chạy được" - dán một giá trị vào, lấy một giá trị ra. Ví dụ,
def my_function[x]:
return 2*x + 6
Hoàn toàn có thể phân tích cú pháp một chuỗi để tự động tạo một hàm như vậy; . sau đó
def makePoly[arr]:
def fn[x]:
return sum[c*x**p for p,c in enumerate[arr]]
return fn
my_func = makePoly[[6, 2]]
my_func[3] # returns 12
Sau đó, bạn cần một chức năng khác liên tục cắm giá trị x vào chức năng của bạn, xem xét sự khác biệt giữa kết quả và những gì nó muốn tìm và điều chỉnh giá trị x của nó để [hy vọng] giảm thiểu sự khác biệt
def dx[fn, x, delta=0.001]:
return [fn[x+delta] - fn[x]]/delta
def solve[fn, value, x=0.5, maxtries=1000, maxerr=0.00001]:
for tries in xrange[maxtries]:
err = fn[x] - value
if abs[err] < maxerr:
return x
slope = dx[fn, x]
x -= err/slope
raise ValueError['no solution found']
Có rất nhiều vấn đề tiềm ẩn ở đây - tìm một giá trị x bắt đầu tốt, giả sử rằng hàm thực sự có nghiệm [tức là không có đáp án nào có giá trị thực cho x^2 + 2 = 0], đạt đến giới hạn của độ chính xác tính toán, . Nhưng trong trường hợp này, chức năng giảm thiểu lỗi là phù hợp và chúng tôi nhận được kết quả tốt
solve[my_func, 16] # returns [x =] 5.000000000000496
Lưu ý rằng giải pháp này không hoàn toàn chính xác. Nếu bạn muốn nó thật hoàn hảo, hoặc nếu bạn muốn thử giải các họ phương trình bằng phương pháp phân tích, bạn phải chuyển sang một con thú phức tạp hơn. một người giải tượng trưng
Một bộ giải ký hiệu, như Mathicala hoặc Maple, là một hệ chuyên gia với rất nhiều quy tắc ["kiến thức"] tích hợp sẵn về đại số, giải tích, v.v.; . Khi bạn đưa cho nó một phương trình, nó sẽ cố gắng tìm một đường đi, một tập hợp các ứng dụng quy tắc, từ vị trí của nó [phương trình] đến vị trí bạn muốn [dạng đơn giản nhất có thể của phương trình, hy vọng là nghiệm]
Phương trình ví dụ của bạn khá đơn giản;
=> LHS[[6, 2]] RHS[[16]]
# rule: pull all coefficients into LHS
LHS, RHS = [lh-rh for lh,rh in izip_longest[LHS, RHS, 0]], [0]
=> LHS[[-10,2]] RHS[[0]]
# rule: solve first-degree poly
if RHS==[0] and len[LHS]==2:
LHS, RHS = [0,1], [-LHS[0]/LHS[1]]
=> LHS[[0,1]] RHS[[5]]
và có giải pháp của bạn. x = 5
Tôi hy vọng điều này mang lại hương vị của ý tưởng;
Đôi khi, trong khi làm việc với Python Strings, chúng ta có thể có một số phép tính nhất định ở định dạng chuỗi và chúng ta cần xây dựng kết quả của nó. Điều này có thể xảy ra trong các lĩnh vực liên quan đến Toán học và dữ liệu. Hãy thảo luận về những cách nhất định mà chúng ta có thể thực hiện nhiệm vụ này
Các hướng dẫn sau đây là phần giới thiệu về giải phương trình tuyến tính và phi tuyến tính bằng Python. Giải pháp cho phương trình tuyến tính là thông qua các phép toán ma trận trong khi các tập hợp phương trình phi tuyến tính yêu cầu người giải để tìm ra giải pháp bằng số
Giải phương trình tuyến tính với Python
Mã nguồn cho các giải pháp tuyến tính
nhập numpy dưới dạng np
A = np. mảng[[ [3,-9], [2,4] ]]
b = np. mảng[[-42,2]]
z = np. linalg. giải[A,b]
in[z]
M = np. mảng[[ [1,-2,-1], [2,2,-1], [-1,-1,2] ]]
c = np. mảng[[6,1,1]]
y = np. linalg. giải[M,c]
in[y]
Giải phương trình phi tuyến bằng Python
Mã nguồn cho giải pháp phi tuyến tính [fsolve]
nhập numpy dưới dạng np
từ scipy. tối ưu hóa fsolve nhập
def myFunction[z].
x = z[0]
y = z[1]
w = z[2]
F = np. trống[[3]]
F[0] = x**2+y**2-20
F[1] = y - x**
F[2] = w + 5 - x*y
return F
zGuess = np. mảng[[1,1,1]]
z = fsolve[myFunction,zGuess]
print[z]
Mã nguồn cho giải pháp phi tuyến tính [gekko]
từ gekko nhập GEKKO
m = GEKKO[]
x,y,w = [m. Var[1] for i in range[3]]
m. Phương trình[[x**2+y**2==20,\
y-x**2==0,\
w+5-x* . giải quyết[disp=False]
m.solve[disp=False]
print[x. giá trị, y. giá trị, w. giá trị]
Giải pháp tượng trưng với Sympy
Sympy là một gói cho các giải pháp tượng trưng trong Python có thể được sử dụng để giải các hệ phương trình
$$2x^2+y+z=1$$ $$x+2y+z=c_1$$ $$-2x+y=-z$$
nhập sympy dưới dạng sym
sym. init_printing[]
x,y,z = sym. biểu tượng['x,y,z']
c1 = sym. Ký hiệu['c1']
f = sym. Eq[2*x**2+y+z,1]
g = sym. Eq[x+2*y+z,c1]
h = sym. Phương trình[-2*x+y,-z]
tượng trưng. giải[[f,g,h],[x,y,z]]
Khi được giải quyết trong môi trường IPython, chẳng hạn như sổ ghi chép Jupyter, kết quả được hiển thị dưới dạng
$$x=-\frac{1}{2}+\frac{\sqrt{3}}{2}$$ $$y=c_1 - \frac{3 \sqrt{3}}{2} +\frac
và giải pháp thứ hai
$$x=-\frac{1}{2}-\frac{\sqrt{3}}{2}$$ $$y=c_1 + \frac{3 \sqrt{3}}{2} +\frac
Cách tiếp cận tương tự áp dụng cho các phương trình tuyến tính hoặc phi tuyến tính
Hướng dẫn bổ sung
Các phương trình tuyến tính và phi tuyến tính cũng có thể được giải bằng Excel và MATLAB. Nhấp vào liên kết thích hợp để biết thêm thông tin và mã nguồn
Ngôn ngữ lập mô hình APMonitor với giao diện Python là phần mềm tối ưu hóa cho các phương trình đại số hỗn hợp nguyên và vi phân. Nó được kết hợp với các bộ giải quy mô lớn để lập trình số nguyên tuyến tính, bậc hai, phi tuyến tính và hỗn hợp [LP, QP, NLP, MILP, MINLP]. Các phương thức hoạt động bao gồm đối chiếu dữ liệu, tối ưu hóa thời gian thực, mô phỏng động và điều khiển dự báo phi tuyến. Nó có sẵn miễn phí thông qua MATLAB, Python, Julia hoặc từ giao diện trình duyệt web