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

Python ValueError:数学域错误(对于二级方程式函数),python,python-2.7,math.sqrt,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

我试图自己解决这个问题,但我做不到。这是一个函数,用于在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开始的,所以我非常抱歉。

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

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

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

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

它应该可以解决您的问题(我还做了一些编辑,使代码看起来更符合python(阅读:pep8))

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

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

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

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

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

首先,值得注意的是,在“二年级数学”中,这个方程没有你(大概)输入值的解。*当你进入高中数学学习虚数时,你知道所有的二次方程都有解,只是有时候解是复数。然后,当你上了大学,你就会知道方程是否有解取决于域;对实数的函数和对复数的函数是不同的函数。因此,无论是从二年级的角度还是从大学的角度来看,Python都通过提出“数学域错误”做了正确的事情

*事实上,你在中学之前学过二次方程吗?那似乎有点早


文件解释说:

这些函数不能用于复数;如果需要支持复数,请使用
cmath
模块中相同名称的函数。由于大多数用户不想学习理解复数所需的数学知识,因此对支持复数的函数和不支持复数的函数进行了区分。通过接收异常而不是复杂结果,可以更早地检测到用作参数的意外复数,这样程序员就可以确定它最初是如何生成的以及为什么生成的

但是还有另一个原因:
math
是专门为标准C库数学函数设计的薄包装。您可以使用为另一种语言编写的代码,该语言使用C的
、C++的
、或Perl、PHP等中的类似函数,并以与Python中的
数学模块相同的方式工作,这是预期目标的一部分


因此,如果需要复数根,只需导入cmath
并使用
cmath.sqrt
而不是
math.sqrt



作为旁注:一般来说,操作员和其他内置程序比这些模块的功能更“友好”。但是,在3.0之前,
**
运算符会违反此规则,因此
**.5
只会提升
值错误:负数不能提升为分数次幂。如果升级到3.x,它将按需要工作。(这一变化与整数除法给出浮点结果的变化完全相同,但在2.6-2.7中没有
\uuuu future\uuuu
语句来启用它,因为它被认为是一个不太明显和重要的变化。)

首先,值得注意的是,在“二年级数学”中,该方程没有一个包含您所需值的解(大概)进入。*当你进入高中数学学习虚数时,你会发现所有二次方程实际上都有解,只是有时候解是复数。然后,当你进入大学时,你会发现方程是否有解取决于域;实数的函数MBER和复数的函数是不同的函数。因此,无论是从二年级的角度还是从大学的角度来看,Python都提出了一个“数学域错误”,这是正确的

*事实上,你在中学之前学过二次方程吗?那似乎有点早


文件解释说:

这些函数不能与复数一起使用;如果需要支持复数,请使用
cmath
模块中的同名函数。由于大多数用户不想学习足够多的数学知识,因此需要区分支持复数的函数和不支持复数的函数rstand复数。接收异常而不是复杂结果允许更早地检测到用作参数的意外复数,这样程序员就可以确定它最初是如何生成的以及为什么生成的

但这还有另一个原因:
math
是专门为标准的C库数学函数设计的薄包装器。这是预期目标的一部分,您可以使用为另一种语言编写的代码,这些语言使用C的
、C++的
或Perl、PHP等中的类似函数,并使其工作相同与Python中的
math
模块一起使用


因此,如果需要复数根,只需导入cmath
并使用
cmath.sqrt