ValueError:数学域错误(对于二级方程函数)

时间:2014-10-13 17:25:44

标签: python python-2.7 math.sqrt

我自己试图解决这个问题,但我不能。它的功能是为了解决y = 0时的二阶方程,如'ax2 + bx + c = 0'。当我执行它时,它说我有数学域错误。如果你能帮助我,那就太好了。

a=raw_input('put a number for variable a:')    
b=raw_input('put a number for variable b:')    
c=raw_input('put a number for variable c:')

a=float(a)    
b=float(b)    
c=float(c)`

import math


x=(-b+math.sqrt((b**2)-4*a*c))/2*a    
print x`

x=(-b-math.sqrt((b**2)-4*a*c))/2*a`    
print x

PD:我从python开始,所以我很抱歉。

2 个答案:

答案 0 :(得分:2)

这里的问题是python中的标准math库无法处理复杂的变量。你在那里的sqrt反映了这一点。

如果你想处理一个可能有复杂变量的函数(比如上面的那个),我建议使用cmath library,它有一个替换cmath.sqrt函数。< / p>

您可以将上述代码更改为以下代码:

from cmath import sqrt

a = raw_input('put a number for variable a:')    
b = raw_input('put a number for variable b:')    
c = raw_input('put a number for variable c:')

a = float(a)    
b = float(b)    
c = float(c)`

x = (-b + sqrt((b**2) - 4 * a * c)) / 2 * a    
print x`

x = (-b - sqrt((b**2) - 4 * a * c)) / 2 * a`    
print x

它应该解决你的问题(我也进行了一些编辑,使代码看起来更加pythonic(阅读:符合pep8))

答案 1 :(得分:2)

首先,值得注意的是,在“二年级数学”中,该等式不会拥有<大概()可能输入的值的解决方案。*当你进入高中数学并学习关于虚数,你知道所有二次方程实际上都有解,只是有时解是复数。然后,当你上大学时,你会发现方程式是否有解决方案取决于领域;实数的函数和复数的函数是不同的函数。因此,从二年级或大学的角度来看,Python通过提出“数学域错误”来做正确的事情。

*实际上,你甚至在中学前学习二次方程式吗?这似乎有点早......


math文档说明:

  

这些功能不能用于复数;如果需要支持复数,请使用cmath模块中相同名称的函数。支持复数的函数和不支持复数的函数之间的区别是因为大多数用户不想学习理解复数所需的数学。接收异常而不是复杂的结果允许更早地检测用作参数的意外复数,以便程序员可以首先确定它的生成方式和原因。

但另一个原因是:math专门设计为围绕标准C库数学函数的薄包装器。您可以为另一种使用C <math.h>,C ++ <cmath>或Perl,PHP等类似函数的语言编写代码,这是预期目标的一部分,并且它的工作方式与Python中的math模块。


因此,如果您想要复杂的根,那么您只需要import cmath并使用cmath.sqrt代替math.sqrt


作为旁注:通常,运算符和其他内置函数比这些模块中的函数更“友好”。但是,在3.0之前,**运算符会违反此规则,因此** .5只会引发ValueError: negative number cannot be raised to a fractional power。如果升级到3.x,它将按预期工作。 (这种变化与整数除法给出浮点结果的变化完全相同,但是在2.6-2.7中没有__future__语句来启用它,因为它被认为不是一个可见且重要的变化。)< / p>