我对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。最后,在一组带括号的括号中打印sol1p2
和sol2p2
。我希望这是有道理的;如果需要对变量名称做出任何澄清,请告诉我。
我正在使用在线编译器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
我不确定为什么。
答案 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.sqrt
,math.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}}