Алгоритм квадратного уравнения MATLAB

Какое условие я должен поставить в коде Matlab, чтобы получить точное решение квадратичного с этими формулами:

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

Непосредственно применяя эти формулы, я не получаю правильного решения в некоторых случаях, таких как x^2-1000001x+1

Большое спасибо за Вашу помощь

2 ответа

Решение

Правильный набор формул

w = b+sign(b)*sqrt(b^2-4*a*c)

x1 = -w/(2*a)

x2 = -(2*c)/w

где знак (b)=1, если b>=0, и знак (b)=-1, если b<0.

Ваши формулы, а также стандартные формулы приводят к катастрофической отмене в одном корне b. а и в.


Если вы хотите пойти на крайние меры, вы также можете избежать чрезмерного или недостаточного вычисления термина при квадратном корне.

Обозначим через m максимальный размер | a |, | b | и | c |, например, максимум показателя степени в их представлении с плавающей запятой или их абсолютного значения... Тогда

w = b+sign(b)*m*sqrt( (b/m)*(b/m)-4*(a/m)*(c/m) )

имеет термин между -10 и 10 ниже корня. И если этот термин равен нулю, то это не вызвано недостатком.

Вы имеете дело с арифметикой с плавающей точкой в ​​matlab, поэтому точные решения не гарантированы. (Т.е. возможно, что каждое отдельное значение с плавающей точкой вызовет ошибку округления, которая дает ненулевой ответ, когда вы подключаетесь к исходному квадратному уравнению). Лучший способ проверить, нашли ли вы решение уравнения с плавающей запятой, - это использовать допуск и проверить, меньше ли абсолютное значение вашего ответа, чем допуск.

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