Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-二次等式极值_Python_Numeric_Numerical Methods_Equation_Quadratic - Fatal编程技术网

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.

我已经用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.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不支持复数和整数之间的算术运算。