在Python中求解数学方程的最简单方法

时间:2009-10-29 08:48:30

标签: python math numpy scipy equation

我想解决一组方程,线性或有时是二次方程。我没有具体的问题,但经常,我经常遇到这种情况。

使用Mathematica的Web等价物wolframalpha.com来解决它们很简单。但这并不能提供iPython shell的舒适性和便利性。

是否有一个简单的库可以处理来自python shell的线性和二次方程式?

就我个人而言,我发现使用卡西欧991 MS科学计算器非常方便。我知道如何设置变量,求解方程式,并做很多事情。我希望这样的工具最好在ipython shell中使用。我很惊讶没有找到任何。圣人并没有给我留下足够的印象;也许我错过了一些东西。

15 个答案:

答案 0 :(得分:46)

sympy正是您所寻找的。

答案 1 :(得分:22)

你认为最好的答案是不可接受的。

您的问题是“我想要一个可以在Python中使用的免费计算机代数系统。”

答案是“SAGE做到了。”

你看过maxima / macsyma吗? SAGE为它提供绑定,这是更强大的免费绑定之一。

http://maxima.sourceforge.net/

答案 2 :(得分:10)

以下是使用Python(通过Sage)解决原始问题的方法。这基本上澄清了Paul McMillan所说的话。

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]]

答案 3 :(得分:7)

对于不精确的解决方案,请阅读linear programmingsequential quadratic optimization,然后搜索为您执行此类优化的Python库。

如果方程需要整数解,那么你应该为Python搜索Diophantine方程求解器。

请注意,使用Project Euler的简单求解器忽略了这一点。有趣和有教育意义的部分是学习如何使用原始方法自己解决它!

答案 4 :(得分:4)

你看过SciPy吗?

它在解决线性代数的教程中有一个例子:

http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system

答案 5 :(得分:4)

用于解决大规模非线性方程组(100万+)的免费网络服务是APMonitor.com。有一个浏览器界面和Python / MATLAB的API。 Python的API是一个脚本(apm.py),可以从apmonitor.com主页下载。将脚本加载到Python代码后,它就能够解决以下问题:

  • 非线性方程
  • 微分和代数方程
  • 最小二乘模型拟合
  • 移动地平线估计
  • 非线性模型预测控制

对于新用户,APM Python软件有一个Google Groups论坛,用户可以在其中发布问题。每两周举办一次网络研讨会,展示运营研究和工程中的优化问题。

以下是优化问题的示例(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

使用以下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

答案 6 :(得分:3)

供参考:Wolfram Alpha's solution

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

在python中,使用sympy's solver module(注意它假设所有方程都设置为零):

>>> 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))]

当然,a = 1000,因为a-1000是两个方程的分母。

答案 7 :(得分:2)

我刚刚开始使用GNU Scientific Library,但它是C库。看起来也有Python bindings。所以,值得一看。

答案 8 :(得分:1)

我会使用Octave,但我同意,Octave的语法并不是我所说的惊心动魄(而且文档总是让我感到困惑,而不是他们的帮助)。

答案 9 :(得分:0)

我认为没有统一的方法同时处理线性和二次(或一般非线性)方程。对于线性系统,python具有与线性代数和矩阵包的绑定。非线性问题倾向于逐案解决。

答案 10 :(得分:0)

这取决于您的需求:

如果你想要一个交互式图形界面,那么sage可能是最好的解决方案。

如果您想避免使用图形界面,但仍想进行计算机代数,那么sympy或maxima可能会满足您的需求。 (同情看起来很有希望,但在取代mathematica之前还有很长的路要走。)

如果你真的不需要符号algrebra,但你需要一种用矩阵编程的方法,求解微分方程,并最小化函数,那么scipy或octave是极好的起点。

答案 11 :(得分:0)

看看这个:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

它非常易于使用且非常强大

答案 12 :(得分:0)

好吧,我只是偶然用Google搜索了这个页面。我看到很多关于这个和那个软件工具的建议,但是任何工具实际上都提供了答案吗?实际的答案是:

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

我是怎么得到的?通过用Maxima编程语言编写快速程序,通过&#34;蛮力&#34;搜索。写作只花了大约10分钟,看我是如何熟悉Maxima语言的。程序运行花了几秒钟。这是程序:

euler_solve():=阻止     (     [a,b,A,B,结束: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])
);

您可以将上面的代码剪切并粘贴到wxMaxima用户界面中,我在Ubuntu而不是MS Windows下运行。然后你只需输入函数名:euler_solve(),点击返回,等待几秒钟,然后弹出答案。这种特殊问题非常简单,您可以使用任何通用编程语言进行搜索。

答案 13 :(得分:0)

尝试在py中应用Bisection method以找到给定间隔的根:

def f(x, rhs): # f(x) = e^x
    return math.e ** x - rhs # e^x = rhs -> e^x - rhs = 0

def solve(rhs, a = 0, b = 100, tol = 1e-3):
    while True:
        c  = (a + b) / 2.0
        if(f(a, rhs) * f(c, rhs) > 0):
            a = c
        else:
            b = c
        if(abs(f(c, rhs)) < tol):
            break
    return c

y = math.e ** 3.75 # x = 3.75
print(solve(y)) # 3.7499..

答案 14 :(得分:-1)

再想一想,我详细介绍了圣人,显然最好的数学免费软件。

只是一些不同的python数学相关库,它集成非常棒。

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

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