25

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

使用wolframalpha.com(Mathematica 的网络等价物)来解决这些问题很简单。但这并不能提供 iPython shell 的舒适和便利。

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

就个人而言,我觉得使用 Casio 991 MS 科学计算器非常方便。我知道如何设置变量,解方程,并且做了很多事情。我想要一个最好在 ipython shell 中使用的工具。我很惊讶没有找到任何东西。我对圣人印象不够;也许我错过了一些东西。

4

15 回答 15

48

sympy正是您正在寻找的。

于 2009-10-29T09:19:37.277 回答
22

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

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

答案是“SAGE 做到了”。

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

http://maxima.sourceforge.net/

于 2009-10-29T08:58:09.653 回答
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]]
于 2010-08-17T22:02:57.540 回答
7

对于不精确的解决方案,请阅读线性规划顺序二次优化,然后搜索为您执行此类优化的 Python 库。

如果方程需要整数解,您应该搜索 Python 的丢番图方程求解器。

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

于 2009-10-29T08:57:46.097 回答
5

APMonitor.com 是用于求解大型非线性方程组(超过 100 万)的免费网络服务。有一个浏览器界面和一个 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
于 2012-02-05T15:21:55.910 回答
4

你看过SciPy吗?

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

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

于 2009-10-29T09:03:38.510 回答
3

供参考:Wolfram Alpha 的解决方案

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

在 python 中,使用sympy 的求解器模块(请注意,它假设所有方程都设置为零):

>>> 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 是两个方程的分母。

于 2012-03-16T15:36:14.203 回答
2

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

于 2009-10-29T09:31:54.053 回答
1

我会为此使用Octave,但我同意,Octave 的语法并不是我所说的令人兴奋的(而且文档总是让我感到困惑,而不是他们的帮助)。

于 2009-10-29T08:55:44.110 回答
0

好吧,我只是偶然在谷歌上搜索到了这个页面。我看到了很多关于这个和那个软件工具的建议,但有没有任何工具真正提供了答案?实际答案是:

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

我是怎么得到这个的?通过用 Maxima 编程语言编写一个快速程序,通过“蛮力”搜索找到它。只花了大约 10 分钟的时间来写,看看我对 Maxima 语言的熟悉程度。程序运行了几秒钟。这是程序:

euler_solve():= 块 ( [ a, b, A, B, end: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])
);

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

于 2011-11-19T00:47:05.937 回答
0

这取决于您的需求:

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

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

如果您真的不需要符号代数,但需要一种使用矩阵编程、求解微分方程和最小化函数的方法,那么 scipy 或 octave 是很好的起点。

于 2009-11-01T12:14:15.343 回答
0

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

于 2009-10-29T08:59:22.917 回答
0

看看这个:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

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

于 2011-07-07T08:06:46.067 回答
0

尝试在 py 中应用Bisection 方法来找到给定间隔的根:

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..
于 2018-06-07T12:28:18.030 回答
-1

再三考虑,我详细介绍了 sage,显然它最好的数学免费软件。

只是一些不同的 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
于 2009-11-01T09:46:00.307 回答