我正在接受一个函数(例如y = x ** 2)并需要求解x。我知道我可以手动解决这个问题,但我试图找到一种方法来使用。我已经浏览了numpy,scipy和sympy,但似乎无法找到我正在寻找的东西。目前我正在从函数中创建一个lambda,所以如果我能够保留该方法的格式,那就太好了,但不是必需的。
谢谢!
答案 0 :(得分:10)
如果您正在寻找数值解决方案(即只对数字感兴趣,而不是符号封闭形式解决方案),那么SciPy.optimize模块中有一些选项可供选择。对于简单的事情,newton
是简单多项式的一个很好的开始,但是你可以从那里得到它。
对于符号解决方案(也就是说得到y = x ** 2 - > x = +/- sqrt(y))SymPy solver大致为您提供所需要的内容。整个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文档的Gotchas and Pitfalls部分,了解如何编码相应的公式。
如果所有这一切都是为了获得方程式的快速而肮脏的解决方案那么总是Wolfram Alpha。
答案 1 :(得分:4)
通过scipy.optimize.newton使用Newton-Raphson。它找到了一个方程的根,即 x 的值,其中f( x )= 0.在本例中,您可以将问题转换为查找根的函数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,后者依赖于知道导数。
答案 2 :(得分:3)
查看SymPy,特别是solver。