求解多项式y
我现在有一个函数,比如 y = x**2,我想求出 x 的值。我知道我可以手动一步一步地算出来,但我想找一种方法来解决这个问题。我查过 numpy、scipy 和 sympy,但似乎没有找到我想要的东西。目前我把这个函数做成了一个 lambda 表达式,如果能用这种格式的方法就更好了,不过这不是必须的。
3 个回答
可以看看SymPy,特别是它的求解器部分。
使用Newton-Raphson方法,通过scipy.optimize.newton来解决问题。这个方法可以找到方程的根,也就是求出哪些值的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,最大迭代次数为106。
为了进一步加快速度,你可以提供相关函数的导数:
>>> sqrt = inverse(lambda x: x**2, lambda x: 2*x)
实际上,如果不提供导数,这个函数会使用割线法,而不是依赖于导数的Newton-Raphson方法。
如果你想要找到数字解(也就是说,你只关心结果的数字,而不是那些复杂的公式解),那么在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那么好,但它是免费的,而且你可以把它集成到自己的程序中。确保阅读注意事项和陷阱部分,了解如何正确编码方程。
如果你只是想快速找到方程的简单解,那么你可以试试Wolfram Alpha。