2009-10-29 38 views
20

Tôi muốn giải một tập hợp các phương trình, tuyến tính hoặc đôi khi bậc hai. Tôi không có một vấn đề cụ thể, nhưng thường xuyên, tôi đã ở trong tình huống này thường xuyên.Cách đơn giản nhất để giải phương trình toán học bằng Python

Thật đơn giản để sử dụng wolframalpha.com, tương đương với web của Mathematica, để giải quyết chúng. Nhưng điều đó không cung cấp sự thoải mái và tiện lợi của một hệ vỏ iPython.

Có thư viện đơn giản nào để làm việc trên phương trình tuyến tính và phương trình bậc hai từ trình bao python không?

Cá nhân tôi thấy rất tiện lợi khi sử dụng máy tính khoa học của Casio 991 MS. Tôi biết làm thế nào để thiết lập các biến, giải phương trình, và làm rất nhiều. Tôi muốn một công cụ như vậy tốt hơn có thể sử dụng từ bên trong một vỏ ipython. Tôi ngạc nhiên không tìm thấy bất kỳ. Tôi không đủ ấn tượng bởi hiền nhân; có lẽ tôi đang thiếu một cái gì đó.

+0

euler dự án, tôi cũng vậy! –

+0

Bạn có biết ngôn ngữ Maxima và giao diện WxMaxima không? Tôi tìm thấy nó cozier hơn IPython – Foad

Trả lời

1

Tôi muốn sử dụng Octave cho điều này nhưng tôi đồng ý, cú pháp của Octave không phải là những gì tôi gọi là ly kỳ (và các tài liệu luôn khiến tôi nhầm lẫn hơn là họ cũng giúp).

5

Để biết các giải pháp không chính xác, hãy đọc trên linear programmingsequential quadratic optimization, sau đó tìm kiếm thư viện Python thực hiện tối ưu hóa như vậy cho bạn.

Nếu phương trình yêu cầu giải pháp nguyên, bạn nên tìm kiếm trình giải phương trình Diophantine cho Python.

Chỉ cần lưu ý rằng việc sử dụng trình giải quyết đơn giản cho Project Euler bị thiếu điểm. Phần thú vị và giáo dục, là học cách tự giải quyết nó bằng các phương pháp nguyên thủy!

22

Bạn giảm giá câu trả lời tốt nhất là không thể chấp nhận.

Câu hỏi của bạn là "Tôi muốn có Hệ thống đại số máy tính miễn phí mà tôi có thể sử dụng bằng Python".

Câu trả lời là "SAGE thực hiện điều đó".

Bạn đã xem maxima/macsyma chưa? SAGE cung cấp các ràng buộc cho nó, và đó là một trong những công cụ miễn phí mạnh mẽ hơn.

http://maxima.sourceforge.net/

0

Tôi không nghĩ rằng có một cách thống nhất để đối phó với cả hai tuyến tính và bậc hai (hay nói chung là phi tuyến) phương trình cùng một lúc. Với hệ thống tuyến tính, python có liên kết với đại số tuyến tính và các gói ma trận. Các vấn đề phi tuyến có xu hướng được giải quyết trên cơ sở từng trường hợp.

+0

ràng buộc tối đa của SAGE có thể đối phó với khá nhiều bất cứ điều gì bạn ném vào chúng. –

2

Tôi vừa bắt đầu sử dụng GNU Scientific Library, tuy nhiên đó là thư viện C. Có vẻ như có cả Python bindings nữa. Vì vậy, nó có thể là giá trị xem xét.

+0

+1, GSL là một thư viện tuyệt vời. –

-1

Suy nghĩ thứ hai, tôi đã xem chi tiết và rõ ràng là phần mềm toán học miễn phí tốt nhất hiện có.

Chỉ cần một số thư viện liên quan đến toán học python khác nhau, nó tích hợp hoàn toàn tuyệt vời.

Toán gói chứa trong Sage:

Algebra GAP, Maxima, Singular 
Algebraic Geometry Singular 
Arbitrary Precision 
Arithmetic GMP, MPFR, MPFI, NTL 
Arithmetic Geometry PARI, NTL,  
mwrank, ecm Calculus Maxima, SymPy, 
GiNaC Combinatorics Symmetrica,  
Sage-Combinat Linear Algebra Linbox, 
IML Graph Theory NetworkX Group  
Theory GAP Numerical 
computation GSL, SciPy, NumPy, 
ATLAS 

gói khác chứa trong Sage:

Command line IPython Database ZODB, 
Python Pickles, SQLite Graphical 
Interface Sage Notebook, jsmath 
Graphics Matplotlib, Tachyon3d, GD, 
Jmol Interactive 
programming language Python 
Networking Twisted 
+10

Thật bất lịch sự khi trả lời câu hỏi của riêng bạn với một câu trả lời trùng lặp do người khác cung cấp và sau đó chấp nhận câu trả lời của riêng bạn. Thay vào đó, hãy chấp nhận câu trả lời chính xác của người khác và chỉnh sửa câu hỏi của bạn để bao gồm thông tin bạn thấy hữu ích hoặc trả lời trong nhận xét. –

+0

Paul, những điểm này không phải là động lực chính của tôi, cũng không phải là trang web, tôi nghĩ. Vượt qua nỗi ám ảnh đó. Mọi người ở đây để chia sẻ thông tin. –

+8

Khá lame, Lakshman. – so12311

0

Nó phụ thuộc vào nhu cầu của bạn:

Nếu bạn muốn một giao diện đồ họa tương tác, sau đó Sage có lẽ là giải pháp tốt nhất.

Nếu bạn muốn tránh sử dụng giao diện đồ họa, nhưng bạn vẫn muốn thực hiện đại số máy tính, thì sympy hoặc maxima có thể đáp ứng nhu cầu của bạn. (sympy trông rất hứa hẹn, nhưng nó vẫn còn một chặng đường dài để đi trước khi họ có thể thay thế mathematica).

Nếu bạn không thực sự cần algrebra tượng trưng, ​​nhưng bạn cần một cách để lập trình với ma trận, giải phương trình vi phân và giảm thiểu hàm, thì scipy hoặc octave là điểm bắt đầu xuất sắc.

10

Dưới đây là cách giải quyết câu hỏi ban đầu của bạn bằng Python (thông qua Sage). Điều này về cơ bản làm rõ nhận xét mà Paul McMillan đưa ra ở trên.

sage: a,b,c = var('a,b,c') 
sage: solve([a+b+c==1000, a^2+b^2==c^2], a,b,c) 
[[a == 1000*(r1 + sqrt(r1^2 + 2000*r1 - 1000000))/(r1 + sqrt(r1^2 + 2000*r1 - 1000000) + 1000), b == -1/2*r1 - 1/2*sqrt(r1^2 + 2000*r1 - 1000000) + 500, c == r1], [a == 1000*(r2 - sqrt(r2^2 + 2000*r2 - 1000000))/(r2 - sqrt(r2^2 + 2000*r2 - 1000000) + 1000), b == -1/2*r2 + 1/2*sqrt(r2^2 + 2000*r2 - 1000000) + 500, c == r2]] 
0

Vâng, tôi chỉ googled vào trang này một cách tình cờ. Tôi thấy nhiều đề xuất liên quan đến điều này và công cụ phần mềm đó, nhưng có công cụ nào thực sự cung cấp câu trả lời không? Câu trả lời thực tế là:

[a, b, c] = [200,375,425]

Làm cách nào để nhận được thông báo này? Bằng cách viết một chương trình nhanh trong ngôn ngữ lập trình Maxima để tìm nó qua tìm kiếm "brute force". Nó chỉ mất khoảng 10 phút để viết, xem như thế nào tôi đã quen thuộc với ngôn ngữ Maxima. Phải mất vài giây để chương trình chạy. Đây là chương trình:

euler_solve(): = chặn ( [a, b, A, B, kết thúc: 1000],

for a thru end do 
    (
    for b thru end do 
     (
     c: 1000 -a -b, 
     if c < 0 then 
      b:end 
     else if a^2 + b^2 = c^2 then 
      (
      A:a, 
      B:b, 
      a:end, 
      b:end 
      ) 
     ) 
    ), 
return([A,B,c]) 
); 

Bạn chỉ có thể cắt và dán đoạn mã trên vào wxMaxima giao diện người dùng, mà tôi chạy theo Ubuntu và không MS Windows.Sau đó, bạn chỉ cần nhập tên chức năng: euler_solve(), nhấn trở lại, chờ đợi một vài giây, và ra bật câu trả lời.Đây là loại vấn đề đặc biệt là rất đơn giản mà bạn có thể sử dụng bất kỳ ngôn ngữ lập trình có mục đích chung nào để thực hiện tìm kiếm.

+2

[200, 375, 425] là một giải pháp tiềm năng, nhưng có một tập hợp các giải pháp vô hạn cho tập phương trình này. [-499000, 999, 499001] là một cái khác. Một giải pháp số có lẽ không phải là những gì OP đang tìm kiếm. – Nate

+0

Câu trả lời này không liên quan vì câu hỏi là Python cụ thể. Nhận xét về các giải pháp vô hạn không phải là do vấn đề mà câu hỏi này đề cập đến (Project Euler 9) có các ràng buộc và đặc biệt giới hạn giải pháp của nó cho một bộ dữ liệu đơn. – anddam

3

Dịch vụ web miễn phí để giải quyết các hệ thống quy mô lớn phương trình phi tuyến (1 triệu +) là APMonitor.com. Có một giao diện trình duyệt và một API cho Python/MATLAB. API cho Python là một tập lệnh duy nhất (apm.py) có sẵn để tải xuống từ trang chủ apmonitor.com.Một khi kịch bản được nạp vào một mã Python, nó mang lại cho khả năng giải quyết vấn đề của:

  • phương trình phi tuyến
  • sai và phương trình đại số
  • Least mô hình vuông phù hợp
  • Moving chân trời ước
  • Điều khiển dự báo mô hình phi tuyến
  • v.v.

Đối với người dùng mới, phần mềm APM Python có diễn đàn Google Groups nơi người dùng có thể đăng câu hỏi. Có các hội thảo trên web hai tuần giới thiệu các vấn đề tối ưu trong nghiên cứu và kỹ thuật hoạt động.

Dưới đây là ví dụ về vấn đề tối ưu hóa (hs71.apm).

Model 

    Variables 

    x[1] = 1, >=1, <=5 

    x[2] = 5, >=1, <=5 

    x[3] = 5, >=1, <=5 

    x[4] = 1, >=1, <=5 

    End Variables 



    Equations 

    x[1] * x[2] * x[3] * x[4] > 25 

    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40 



    minimize x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3] 

    End Equations 

End Model 

Vấn đề tối ưu hóa được giải quyết với các kịch bản sau đây Python:

# Import 

from apm import * 

# Select server 

server = 'http://xps.apmonitor.com' 

# Application name 

app = 'eqn' 

# Clear previous application 

apm(server,app,'clear all') 

# Load model file 

apm_load(server,app,'hs71.apm') 

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT) 

apm_option(server,app,'nlc.solver',3) 

# Solve on APM server 

solver_output = apm(server,app,'solve') 


# Display solver output 

print solver_output 


# Retrieve results 

results = apm_sol(server,app) 

# Display results 

print '--- Results of the Optimization Problem ---' 

print results 

# Display Results in Web Viewer 

url = apm_var(server,app) 

print "Opened Web Viewer: " + url 
3

Để tham khảo: Wolfram Alpha's solution:

a-1000!=0, b = (1000 (a-500))/(a-1000), c = (-a^2+1000 a-500000)/(a-1000) 

Trong python, sử dụng sympy's solver module (lưu ý rằng nó giả định tất cả các phương trình là đặt bằng 0):

>>> import sympy 
>>> a, b, c = sympy.symbols('a, b, c') 
>>> sympy.solve([a + b + c - 1000, a**2 + b**2 - c**2], b, c) 
[(1000*(a - 500)/(a - 1000), (-a**2 + 1000*a - 500000)/(a - 1000))] 

Và tất nhiên, a! = 1000, như a-1000 là mẫu số của hai phương trình.

Các vấn đề liên quan