【问题标题】:ValueError: Math domain error (for a 2nd grade equation function)ValueError:数学域错误(对于二年级方程函数)
【发布时间】:2014-12-08 08:17:06
【问题描述】:

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

【问题讨论】:

  • 你是一个负数的平方根,这意味着没有真正的解决方案。
  • @matsjoyce 是正确的,但 python 拥有出色的 cmath 库,用于提供想象的解决方案。
  • @SlaterTyranus 你确定他想进入i**2 = -1的世界吗?

标签: python python-2.7 math.sqrt


【解决方案1】:

这里的问题是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

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

【讨论】:

    【解决方案2】:

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

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


    math 文档解释:

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

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


    因此,如果您想要复杂的根,您所要做的就是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__ 语句,因为它被认为是不那么明显和重要的更改。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2021-08-04
      • 2020-05-06
      相关资源
      最近更新 更多