Алгоритм квадратного уравнения 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, поэтому точные решения не гарантированы. (Т.е. возможно, что каждое отдельное значение с плавающей точкой вызовет ошибку округления, которая дает ненулевой ответ, когда вы подключаетесь к исходному квадратному уравнению). Лучший способ проверить, нашли ли вы решение уравнения с плавающей запятой, - это использовать допуск и проверить, меньше ли абсолютное значение вашего ответа, чем допуск.