1

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

4

2 回答 2

2

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

如果你想处理一个可能有复杂变量的函数(比如上面的那个),我建议使用cmath library,它有一个替换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

它应该可以解决您的问题(我还进行了一些编辑以使代码看起来更像 pythonic(阅读:pep8 兼容))

于 2014-10-13T17:29:52.280 回答
2

首先,值得注意的是,在“二年级数学”中,该方程没有您(可能)输入的值的解。*当您进入高中数学并学习虚数时,您会了解到所有二次方程实际上确实有解决方案,只是有时解决方案是复数。然后,当你上大学时,你会了解到方程是否有解取决于领域;实数函数和复数函数是不同的函数。因此,无论是从二年级的角度还是从大学的角度来看,Python 通过引发“数学领域错误”来做正确的事情。

* 其实,你在中学之前就学过二次方程吗?好像有点早了……</sub>


math文档解释:

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

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


所以,如果你想要复杂的根,你所要做的就是import cmath使用cmath.sqrt而不是math.sqrt.


附带说明:通常,运算符和其他内置函数比这些模块中的函数更“友好”。然而,直到 3.0,**运营商打破了这个规则,所以** .5只会 raise ValueError: negative number cannot be raised to a fractional power。如果升级到 3.x,它将按需要工作。(此更改与整数除法给出浮点结果的更改完全相同,但__future__在 2.6-2.7 中没有启用它的声明,因为它被认为是不那么明显和重要的更改。)

于 2014-10-13T17:43:16.200 回答