4

我正在接受一个函数(例如 y = x**2)并且需要求解 x。我知道我可以煞费苦心地手动解决这个问题,但我正试图找到一种可以使用的方法。我浏览了 numpy、scipy 和 sympy,但似乎找不到我要找的东西。目前我正在从函数中制作一个 lambda,所以如果我能够为该方法保留该格式会很好,但不是必需的。

谢谢!

4

3 回答 3

10

如果您正在寻找数值解决方案(即只对数字感兴趣,而不是符号封闭形式的解决方案),那么SciPy.optimize模块中有几个选项供您选择。对于一些简单的事情,newton对于简单多项式来说,这是一个很好的开始,但你可以从那里开始。

对于符号解决方案(也就是说得到 y = x**2 -> x = +/- sqrt(y)) , SymPy 求解器大致为您提供所需的内容。整个 SymPy 包都是针对进行符号操作的。

这是一个使用Python解释器解决问题中提到的方程的示例。您需要确保安装了 SymPy 包,然后:

>>>> from sympy import * # we are importing everything for ease of use
>>>> x = Symbol("x")
>>>> y = Symbol("y")     # create the two variables
>>>> equation = Eq(x ** 2, y) # create the equation
>>>> solve(equation, x)
[y**(1/2), -y**(1/2)]

如您所见,即使作为交互式代数系统,这些基础也相当可行。不如Mathematica好,但话又说回来,它是免费的,您可以将其合并到您自己的程序中。请务必阅读 SymPy 文档的陷阱和陷阱部分,了解如何编码适当的方程式。

如果这一切都是为了得到方程的快速而肮脏的解决方案,那么总会有Wolfram Alpha

于 2010-12-09T03:22:27.703 回答
4

通过scipy.optimize.newton使用 Newton-Raphson 。它找到方程的根,即f( x ) = 0 的x值。在示例中,您可以将问题转换为寻找函数 f( x ) = x ² - y的根。如果你提供一个计算y的 lambda ,你可以提供一个通用的解决方案:

def inverse(f, f_prime=None):
    def solve(y):
        return newton(lambda x: f(x) - y, 1, f_prime, (), 1E-10, 1E6)
    return solve

使用这个函数非常简单:

>>> sqrt = inverse(lambda x: x**2)
>>> sqrt(2)
1.4142135623730951
>>> import math
>>> math.sqrt(2)
1.4142135623730951

根据输入函数,您可能需要将参数调整为newton(). 当前版本使用 1 的起始猜测、10 -10的容差和 10 6的最大迭代计数。

为了进一步加快速度,您可以提供相关函数的导数:

>>> sqrt = inverse(lambda x: x**2, lambda x: 2*x)

事实上,没有它,该函数实际上使用的是割线法,而不是依赖于知道导数的 Newton-Raphson 法。

于 2010-12-09T03:18:45.420 回答
3

查看 SymPy,特别是求解器

于 2010-12-09T03:20:55.247 回答