如何在Python中求解方程式?

use*_*937 21 python equation calculator

假设我有一个等式:

2x + 6 = 12

用代数我们可以看到x = 3.如何在Python中创建可以解决的程序x?我是新的节目,我看了看eval()exec(),但我无法弄清楚如何让他们做我想做的.我不想使用外部库(例如SAGE),我想在纯Python中执行此操作.

eum*_*iro 28

SymPy怎么样?他们的求解器看起来像你需要的.如果你想自己构建库,看看他们的源代码......

  • 在这个问题的所有讽刺评论的几分钟内,有趣地看到这样的答案:D (3认同)

Hug*_*ell 17

有两种方法可以解决这个问题:数字和符号.

要以数字方式解决它,您必须首先将其编码为"可运行"函数 - 粘贴一个值,得到一个值.例如,

def my_function(x):
    return 2*x + 6
Run Code Online (Sandbox Code Playgroud)

很有可能解析一个字符串来自动创建这样一个函数; 假设你解析2x + 6成一个列表,[6, 2](其中列表索引对应于x的幂 - 所以6*x ^ 0 + 2*x ^ 1).然后:

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
Run Code Online (Sandbox Code Playgroud)

然后你需要另一个函数,它反复地将x值插入你的函数中,查看结果与它想要查找的内容之间的差异,并调整其x值(希望)最小化差异.

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')
Run Code Online (Sandbox Code Playgroud)

这里有很多潜在的问题 - 找到一个好的起始x值,假设函数实际上有一个解(即没有x ^ 2 + 2 = 0的实值答案),达到了计算精度的极限,但在这种情况下,误差最小化函数是合适的,我们得到了一个很好的结果:

solve(my_func, 16)    # returns (x =) 5.000000000000496
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案并非绝对,完全正确.如果你需要它是完美的,或者如果你想分析地尝试解决方程族,你必须转向一个更复杂的野兽:一个象征性的解决者.

像Mathematica或Maple这样的符号求解器是一个专家系统,它有很多关于代数,微积分等的内置规则("知识"); 它"知道"sin的导数是cos,kx ^ p的导数是kpx ^(p-1),依此类推.当你给它一个方程式时,它试图找到一条路径,一组规则应用程序,从它(方程式)到你想要的位置(方程式中最简单的形式,希望是解决方案) .

你的例子方程很简单; 符号解决方案可能如下所示:

=> 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])
Run Code Online (Sandbox Code Playgroud)

并且有你的解决方案:x = 5.

我希望这能带来这种想法的味道; 实施细节(找到一套好的,完整的规则并决定何时应用每条规则)很容易消耗许多人年的努力.


Pas*_*ion 9

Python可能很好,但它不是上帝......

有几种不同的方法来解决方程式.如果您正在寻找分析解决方案,已经提到过SymPy.

如果你很高兴能有一个数值解决方案,Numpy有一些可以提供帮助的例程.如果您只对多项式的解决方案感兴趣,numpy.roots将起作用.特别针对您提到的案例:

>>> import numpy
>>> numpy.roots([2,-6])
array([3.0])
Run Code Online (Sandbox Code Playgroud)

对于更复杂的表达式,请查看scipy.fsolve.

无论哪种方式,你都无法使用库逃脱.


Li-*_*Yip 6

如果你只想解决正整数的极其有限的方程组,那么这将做:mx + c = ym, c, y

import re
def solve_linear_equation ( equ ):
    """
    Given an input string of the format "3x+2=6", solves for x.
    The format must be as shown - no whitespace, no decimal numbers,
    no negative numbers.
    """
    match = re.match(r"(\d+)x\+(\d+)=(\d+)", equ)
    m, c, y = match.groups()
    m, c, y = float(m), float(c), float(y) # Convert from strings to numbers
    x = (y-c)/m
    print ("x = %f" % x)
Run Code Online (Sandbox Code Playgroud)

一些测试:

>>> solve_linear_equation("2x+4=12")
x = 4.000000
>>> solve_linear_equation("123x+456=789")
x = 2.707317
>>> 
Run Code Online (Sandbox Code Playgroud)

如果你想认识与解决任意方程一样sin(x) + e^(i*pi*x) = 1,那么你将需要实现某种象征性的数学引擎,类似于maxima,Mathematica,MATLAB的solve()或象征性的工具箱,等等.作为一个新手,这是超出你肯.