Выявление ошибок в квадратных уравнениях

Предположим, вы пишете программу на 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

Который обеспечивает лечение этого вопроса с точки зрения численной стабильности. Вы обнаружите, среди прочего, что уравнения, которые я (пере) получил выше, называются "формулой Виета".

Другие вопросы по тегам