Python-二次等式极值
我已经用Python编写了求解二次方程的代码。但是它有非常大的错误,比如“1e10”和“-1e10”。是否有任何数字或python解决方案Python-二次等式极值,python,numeric,numerical-methods,equation,quadratic,Python,Numeric,Numerical Methods,Equation,Quadratic,我已经用Python编写了求解二次方程的代码。但是它有非常大的错误,比如“1e10”和“-1e10”。是否有任何数字或python解决方案 enter code here import math import cmath def solve_quad(b, c): a = 1 D = b*b - 4*a*c if (D > 0): x1 = (-b - math.sqrt(D)) / (2*a) x2 = (-b + math.
enter code here
import math
import cmath
def solve_quad(b, c):
a = 1
D = b*b - 4*a*c
if (D > 0):
x1 = (-b - math.sqrt(D)) / (2*a)
x2 = (-b + math.sqrt(D)) / (2*a)
elif D == 0:
x1 = (-b - math.sqrt(D)) / (2*a)
x2 = x1
else:
x1 = (-b - cmath.sqrt(D)) / (2*a)
x2 = (-b + cmath.sqrt(D)) / (2*a)
return x1, x2
print(solve_quad(1e10, 4))
输出:
(-1000000000.0,0.0)可能存在浮点精度问题。您可以使用十进制或其他类似的库来获得更好的精度,并避免这种情况:
from decimal import *
def solve_quad(b, c):
a = 1
D = b*b - 4*a*c
if (D > 0):
x1 = (-b - D.sqrt()) / (2*a)
x2 = (-b + D.sqrt()) / (2*a)
elif D == 0:
x1 = (-b - D.sqrt()) / (2*a)
x2 = x1
else:
x1 = (-b - D.sqrt()) / (2*a)
x2 = (-b + D.sqrt()) / (2*a)
return x1, x2
print(solve_quad(Decimal(1e10), Decimal(4)))
这是一个非常古老且经常重复的话题。让我们再解释一遍。使用二项式定理可以避免数值不稳定性 作为第一个根,您选择了
-b
的符号与平方根之前的符号相同的根
if D>0:
SD = D**0.5;
if b > 0: SD = -SD
x1 = (-b+SD) / (2*a)
然后,对于第二个根,使用公式
(-b-SD) / (2*a)
= (b^2-SD^2) / (2*a*(-b+SD))
= 4*a*c / (2*a*(-b+SD))
= (2*c) / (-b+SD)
得到
x2 = (2*c) / (-b+SD)
在其他情况下,本程序避免的灾难性取消不会发生
这完全避免了由于灾难性相消导致的所有数值不稳定性。如果您想更进一步,您还可以尝试避免判别式计算中的潜在溢出。谢谢您的回复,但它不起作用,因为python不支持复数和整数之间的算术运算。