求解二次公式

时间:2013-05-02 06:30:57

标签: python math quadratic equation-solving

我正在编写一个程序来使用二次方程式求解二次方程,但只有在a = 1时它才有效,但我希望它在a大于1的情况下工作

这是我的代码:

import math

def solve(a, b, c):

    x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
    print "x = %s" %x
    print "or"
    y = ((-1)* b - math.sqrt(b**2-4*a*c))/2*a
    print "x = %s" %x




while 1:
    a = int(raw_input("Enter A :"))
    b = int(raw_input("Enter B :"))
    c = int(raw_input("Enter C :")) 
    solve(a, b, c)

它适用于1但是当我使用多于一个的数字时,我使用说4我得到此错误

Traceback (most recent call last):
  File "C:\Documents and Settings\User\Desktop\Factor.py", line 18, in <module>
    solve(a, b, c)
  File "C:\Documents and Settings\User\Desktop\Factor.py", line 5, in solve
    x = ((-1)* b + math.sqrt(b**2-4*a*c))/2*a
ValueError: math domain error
如果有这样的帮助,有没有办法解决这个问题!!

5 个答案:

答案 0 :(得分:5)

问题在于:

  1. 运算符优先级:您的/2*a应该/(2*a)才能正常工作。
  2. sqrt:[{1}}的域名为负数。
  3. 编辑2: math.sqrty = ...之后print "or"
  4. 要修复后者,你需要某种条件:

    x = ...

    修改:您还可以使用disc = b**2 - 4*a*c sqrtdisc = math.sqrt(disc) if disc >= 0 else math.sqrt(-disc)*1j ,自动处理负数:

    cmath.sqrt

    (感谢各位其他回答者有效地告诉我disc = b**2 - 4*a*c sqrtdisc = cmath.sqrt(disc) 存在。)

答案 1 :(得分:4)

您获得ValueError的原因是您的表达式b**2-4*a*c返回了一个负值,math.sqrt不允许这样做。

>>> math.sqrt(-1)
Traceback (most recent call last):
  File "<ipython-input-38-5234f21f3b4d>", line 1, in <module>
    math.sqrt(-1)
ValueError: math domain error

使用cmath.sqrt来处理负值:

>>> import cmath
>>> cmath.sqrt(-1)
1j

答案 2 :(得分:4)

要处理复数,请改用cmath。

import cmath
cmath.sqrt(negativenumber)

答案 3 :(得分:3)

您获得math domain error,因为您给math.sqrt一个负值。这可能会在您增加a时发生,因为您没有将b增加到足以使b**2-4*a*c给出正值。

答案 4 :(得分:0)

尝试使用类似的东西来获得根源:

def roots(a, b, c):

    def getDiscriminant(a, b, c,Error = "Imaginary Roots"):
        try:
            return (b ** 2 - (4 * a * c)) ** .5
        except:
            return Error

    D = getDiscriminant(a, b, c) 

    if D == False:
        return False

    b = -b
    a = 2 * a

    firstroot = float((b + D) / float(a))
    secondroot = float((b - D) / float(a))

    return (firstroot,secondroot)