二次根函数中的数学域错误

时间:2015-10-10 12:40:43

标签: python python-3.x

我的代码:

def root1(a,b,c):
    return (-b+sqrt((b**2)-4*a*c))/2*a
def root2(a,b,c):
    return (-b-sqrt((b**2)-4*a*c))/2*a

我得到ValueError: math domain error,我无法弄明白为什么。

2 个答案:

答案 0 :(得分:6)

大概你有类似

的东西
from math import sqrt

使用

代替该导入
from cmath import sqrt

cmath中的sqrt函数可以处理否定参数。

例如,

>>> from math import sqrt
>>> sqrt(-4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

>>> from cmath import sqrt
>>> sqrt(-4)
2j

答案 1 :(得分:1)

作为使用cmath的优秀想法的替代方法,您可以坚持实数透视并仍然创建二次公式的安全版本。激进派下的表达式D称为discriminant,在数学中有多种用途。在处理二次方位时看到三种情况并不常见(例如,当将有理函数与二次分母相结合时,根据D <0,D = 0或D> 0,需要使用不同的方法)。下面的代码计算判别式并返回一个元组,它具有0,1或2个数字,具体取决于是否有0,1或2个实根。调用代码可以检查返回值的长度,并根据它确定要执行的操作:

def discriminant(a,b,c):
    return b**2 - 4*a*c

def quadratic(a,b,c):
    D = discriminant(a,b,c)
    if D > 0:
        sqr = math.sqrt(D)
        return ((-b + sqr)/(2*a), (-b - sqr)/(2*a))
    elif D == 0:
        return (-b/(2*a),)
    else:
        return ()

例如:

>>> quadratic(1,2,-3)
(1.0, -3.0)
>>> quadratic(1,2,1)
(-1.0,)
>>> quadratic(1,2,3)
()