python中的二次公式求解器

时间:2016-09-07 19:08:54

标签: python math compiler-errors

我对python有点新鲜,但我正在努力学习。我的代码是

import math

a = 5
b = 5
c = 5

def quad_solve(a, b, c):
    q1 = b*b
    q2 = 4*a*c
    q3 = 2*a
    q4 = q1-q2
    sqr = math.sqrt(q4)
    sol1p1 = b+sqr
    sol1p2 = sol1p1/2
    sol2p1 = b-sqr
    sol2p2 = sol2p1/2
    print ("(",sol1p2,",",sol2p2,")")

quad_solve(a, b, c)

当我运行它时会出现错误

Traceback (most recent call last):
  File "python", line 19, in <module>
  File "python", line 12, in quad_solve
ValueError: math domain error
我真的不明白。

我试图创建一个二次公式求解器。我使用数学模块,然后定义三个变量a,b和c。然后,我定义了一个接受这些变量的函数(我在最后调用函数)。在函数中,我定义了四个量。 q1是平方根下的b平方,q2是平方根下的4ac,q3是分母,q4计算平方根下的总数(即q1 - q2)。然后,我定义一个名为sqr的变量,它等于q4的平方根。然后,我定义了另外四个变量,用于计算解。 sol1p1需要b + sqr,sol1p2需要sol1p1并将其除以2。这给出了第一个解决方案。然后,sol2p1采用b - sqr,sol2p2采用sol2p1并将其除以2。最后,在一组带括号的括号中打印sol1p2sol2p2。我希望这是有道理的;如果需要对变量名称做出任何澄清,请告诉我。

我正在使用在线编译器repl.it(我不知道是否有任何特殊要考虑的内容)。

谢谢!

修改

根据Code Apprentice的推荐,我更新了我的代码。我首先添加了一个if语句:

import math

a = 5
b = 5
c = 5

def quad_solve(a, b, c):
    q1 = b*b
    q2 = 4*a*c
    q3 = 2*a
    q4 = q1-q2
    check = math.tan(q2)
    if (q1 > check):
        sqr = math.sqrt(q4)
        sol1p1 = b+sqr
        sol1p2 = sol1p1/2
        sol2p1 = b-sqr
        sol2p2 = sol2p1/2
        print ("(",sol1p2,",",sol2p2,")")
    else:
        print "Imaginary number. There are no zeros."

    quad_solve(a, b, c)

但它会继续返回错误

Traceback (most recent call last):
  File "python", line 23, in <module>
  File "python", line 14, in quad_solve
ValueError: math domain error

我不确定为什么。

6 个答案:

答案 0 :(得分:3)

这是我在最少的代码行中的答案版本:

    filename, ok = QInputDialog.getText(None, 'Input Dialog', '<html style="font-size:12pt;">Enter the file name:</html>')

答案 1 :(得分:1)

b ^ 2必须大于4ac,所以现在,sqrt()函数得到负数。

答案 2 :(得分:1)

如果您只想获得结果(而不是学习如何执行此操作),则可以使用sympy

from sympy import var, solve

x = var("x")
print(solve(5*x**2 + 5*x + 5))
# prints [-1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]

答案 3 :(得分:0)

有两种方法可以做到这一点(由于Code-Apprentice,Pablo Iocco和Tom Pitts给出了很好的提示,我想到了这一点。)

import cmath
import math

a = 1
b = 3
c = 2

def quad_solve_exact(a, b, c):
    d = (b*b)-(4*a*c)
    solution1 = (-b-cmath.sqrt(d))/(2*a)
    solution2 = (-b+cmath.sqrt(d))/(2*a)
    print (solution1,solution2)

quad_solve_exact(a, b, c)

def quad_solve(a, b, c):
    if (b*b > 4*a*c):
        print "There is a solution!"
        d = math.sqrt((b*b)-(4*a*c))
        solution1 = (-b-math.sqrt(d))/(2*a)
        solution2 = (-b+math.sqrt(d))/(2*a)
        print (solution1,solution2)
    else:
        print "No solutions, imaginary number"

quad_solve(a, b, c)

第一种方式更准确。问题是普通sqrt包使用的math函数无法处理负数。但是,有一个包cmath可以处理负数。因此,您导入两个包(在第二个示例中使用正常的math包),然后定义a,b和c。然后,在您的函数中,您可以比我更多地组合变量,从而导致更短/更清晰的代码。因此,变量d用于表示平方根下的内容。然后,对于每个解,将-b加到或减去d的平方根,所有这些除以2a。然后,打印解决方案。

第二种解决方案不太准确,但完全可以用于我的目的。新功能也需要a,b和c。然后,使用if语句确保平方根的数字不是负数。如果是负数,则运行else语句,打印出没有解决方案。如果变量传递了if语句,则会打印出确实存在解决方案,并且基本上使用与以前相同的代码,除了使用cmath.sqrtmath.sqrt之外。

答案 4 :(得分:0)

尝试以下代码:

import cmath
a=float(input("Enter a: "))
b=float(input("Enter b: "))
c=float(input("Enter c: "))
sol 1=(-b-cmath.sqrt(b**2)-(4*a*c)/(2*a))
sol 2=(-b+cmath.sqrt(b**2)-(4*a*c)/(2*a))
print("x = {0}and{1}".format (sol1,sol2))

请给我一个反馈,它是否可以解决

答案 5 :(得分:0)

这是我尝试学习python时对二次求解器的最初尝试。 这是非常基本的,不会检查虚构的解决方案。 如果解决方案不正确,它将只会失败。

{{1}}