二次方程的误差辨识

2024-04-18 19:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您编写了一个Python程序来计算ax2+bx+c=0的实根,其中系数a、b和c都是实数。这两个解的传统公式是

x1 = (-b - sqrt(b*b-4*a*c)) / 2a, 
x2 = (-b + sqrt(b*b-4*a*c)) / 2a.

我需要确定公式没有意义或导致较大舍入误差的情况(系数值),并提出可用于这些情况的替代公式,以避免出现问题。在

我需要做什么?在


Tags: 程序情况sqrt传统公式数值误差意义
1条回答
网友
1楼 · 发布于 2024-04-18 19:33:05

出现问题有两种情况。第一种情况是平方根内的项(“判别式”)变为负值,即

if(b*b - 4*a*c < 0 ):
  # do something. This doesn't have real roots

第二个更微妙。当您减去两个大小几乎相同的大数时,可能会出现舍入错误。当4*a*c << b*b时,较小的根将发生这种情况。您可以进行系列扩展:

^{pr2}$

这个术语变成

2 * a * c / b

所以最后的根是

x1 = - c / b

这是一个有趣的结果。当然,另一个根仍然

x2 = (b + sqrt( b * b - 4 * a * c)) / (2 * a)

没有太多的错误传播-尽管你可以说它会倾向于

x2 = - b / a

当c变得很小的时候。在

所有这些都与Python无关,它是基本的数学。我可能犯了错误-去看看你能不能找到。在

要获得更多帮助,请查看http://en.wikipedia.org/wiki/Quadratic_equation#Floating-point_implementation

它从数值稳定性的角度对这个问题进行了处理。你会发现,除其他外,我(重新)推导出的方程称为“维塔公式”。在

相关问题 更多 >