Выявление ошибок в квадратных уравнениях
Предположим, вы пишете программу на 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.
Мне нужно идентифицировать ситуации (значения коэффициентов), где формулы не имеют смысла или приводят к большим ошибкам округления, и предложить альтернативные формулы, которые можно использовать в этих случаях, чтобы избежать проблемы.
Что мне нужно сделать?
1 ответ
Есть две ситуации, когда возникают проблемы. Первое, когда термин внутри квадратного корня ("Дискриминант") становится отрицательным, т.е.
if(b*b - 4*a*c < 0 ):
# do something. This doesn't have real roots
Второй более тонкий. Когда вы вычитаете два больших числа, которые имеют почти одинаковый размер, существует вероятность ошибки округления. Это произойдет для меньшего корня, когда 4*a*c << b*b
, Вы можете сделать серию расширений:
b - sqrt(b*b - 4*a*c)
= b * ( 1 - sqrt(1 - 4 * a * c / (b * b)))
~ b * ( 1 - 1 + 2 * a * c / (b * b)) # when 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
когда с становится очень маленьким.
Все это не имеет ничего общего с Python - это базовая математика. И я, возможно, допустил ошибки - иди и посмотри, сможешь ли ты их найти
Для получения дополнительной помощи вы можете посмотреть на http://en.wikipedia.org/wiki/Quadratic_equation
Который обеспечивает лечение этого вопроса с точки зрения численной стабильности. Вы обнаружите, среди прочего, что уравнения, которые я (пере) получил выше, называются "формулой Виета".