我正在接受一个函数(例如 y = x**2)并且需要求解 x。我知道我可以煞费苦心地手动解决这个问题,但我正试图找到一种可以使用的方法。我浏览了 numpy、scipy 和 sympy,但似乎找不到我要找的东西。目前我正在从函数中制作一个 lambda,所以如果我能够为该方法保留该格式会很好,但不是必需的。
谢谢!
如果您正在寻找数值解决方案(即只对数字感兴趣,而不是符号封闭形式的解决方案),那么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。
通过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 法。
查看 SymPy,特别是求解器。