2024-04-18 19:33:05 发布
网友
假设您编写了一个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.
我需要确定公式没有意义或导致较大舍入误差的情况(系数值),并提出可用于这些情况的替代公式,以避免出现问题。在
我需要做什么?在
出现问题有两种情况。第一种情况是平方根内的项(“判别式”)变为负值,即
if(b*b - 4*a*c < 0 ): # do something. This doesn't have real roots
第二个更微妙。当您减去两个大小几乎相同的大数时,可能会出现舍入错误。当4*a*c << b*b时,较小的根将发生这种情况。您可以进行系列扩展:
4*a*c << b*b
这个术语变成
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
它从数值稳定性的角度对这个问题进行了处理。你会发现,除其他外,我(重新)推导出的方程称为“维塔公式”。在
出现问题有两种情况。第一种情况是平方根内的项(“判别式”)变为负值,即
第二个更微妙。当您减去两个大小几乎相同的大数时,可能会出现舍入错误。当
^{pr2}$4*a*c << b*b
时,较小的根将发生这种情况。您可以进行系列扩展:这个术语变成
所以最后的根是
这是一个有趣的结果。当然,另一个根仍然
没有太多的错误传播-尽管你可以说它会倾向于
当c变得很小的时候。在
所有这些都与Python无关,它是基本的数学。我可能犯了错误-去看看你能不能找到。在
要获得更多帮助,请查看http://en.wikipedia.org/wiki/Quadratic_equation#Floating-point_implementation
它从数值稳定性的角度对这个问题进行了处理。你会发现,除其他外,我(重新)推导出的方程称为“维塔公式”。在
相关问题 更多 >
编程相关推荐