Python中的平方根

3
>>> import math
>>> math.sqrt(4)
2.0

为什么Python不返回负数平方根(因为-2也是4的平方根)?
如何让Python返回负数平方根?


8
嗯,没有负数的平方根。虽然多项式 x2 - 4 = 0 有两个根,即 2-2,但是平方根函数只有一个值,并且定义为正数的那个。 - millimoose
3
你可以使用-math.sqrt(4)来得到你想要的结果。 - gefei
更正我的上一条评论:虽然数字 4 有两个平方根,但“平方根函数”只被定义为返回正数。(因为数学函数只能对于给定的输入有值。) - millimoose
3个回答

10
如果你需要一个数字的所有根,你可以使用numpy.roots
>>> import numpy
>>> def root(n, r):
    p = [1] + [0] * (r - 1) + [-n]
    return numpy.roots(p)

>>> root(4, 2)
array([ 2., -2.])
>>> root(-4, 2)
array([ 0.+2.j,  0.-2.j])
>>> root(1, 3)
array([-0.5+0.8660254j, -0.5-0.8660254j,  1.0+0.j       ])

另一个选择是使用Sympy 多项式模块

>>> from sympy import symbols, solve
>>> solve(x**2 - 4)
[-2, 2]
>>> from sympy import symbols, solve
>>> solve(x**2 - 4)
[-2, 2]
>>> solve(x**3 - 1)
[1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]
>>> solve(x**2 + 4)
[-2*I, 2*I]

root(1, 3) 的意思是立方根吗? - confused
@confused:是的,它是立方根。 - Abhijit

9
如何呢:
def my_sqrt(x):
    root1 = math.sqrt(x)
    root2 = -root1
    return root1,root2

另一个可能的选项是使用 numpy.root - Abhijit

4
这并不是 Python 或平方根函数特有的问题,而是我们处理非“单射”函数的反函数时经常遇到的问题。详见http://en.wikipedia.org/wiki/Injective_function
也就是说,任何一个函数的反函数中,如果有多个 x 值映射到同一个 y 值,例如 y=x**2,这个问题都会出现。
你可以对许多其他函数提出同样的抱怨,例如反正弦(arcsin)。什么值的 "x" 使得 sin(x)=0.5?即使我们只考虑 +/- 180 度(+/- pi)的范围,也有两个解,x=30度和x=150度。但是反正弦的实现总是只返回30度(pi/6)。如果我们想要“另一个反函数”,通常只需利用特定函数的知识来获得它。
对于反平方根(sqrt),只需在前面加上一元负号即可。对于反正弦,则是取补角,例如 pi-arcsin(0.5)。

“sin”有点难,因为存在无限多的“x”,使得“sin(x)= y”。 - mgilson
@mgilson,这就是我说“即使我们只考虑跨度+/- 180度”的原因。也就是说,在圆的一周中,仍然有两个反正弦值! - Stuart
4
好的 :). 抱歉,我只读了你的第一段和最后一段...我猜这就是我阅读太多科学论文的结果。...摘要...翻页...结论...嗯...有趣... - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接