алгоритм квадратного уравнения 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

Спасибо большое за помощь


person Oriol Prat    schedule 14.03.2014    source источник
comment
корни дадут вам лучший ответ. Он использует матричный метод.   -  person Joe Serrano    schedule 15.03.2014
comment
Если вы не хотите полностью символизировать (ваши теги предполагают, что вас интересуют числовые методы), вы можете попробовать арифметика с переменной точностью.   -  person horchler    schedule 15.03.2014
comment
Я сомневаюсь в формуле, которую вы используете для корней. Не должно быть (-b+sqrt(b^2-4ac)) / 2a и (-b-sqrt(b^2-4ac)) / 2a   -  person Sourabh Bhat    schedule 16.03.2014
comment
Да, но я хотел проанализировать десятичную разницу, которую Matlab вызывает между классической формулой   -  person Oriol Prat    schedule 16.03.2014


Ответы (2)


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

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

x1 = -w/(2*a)

x2 = -(2*c)/w

где sign (b) = 1, если b> = 0, и sign (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 ниже корня. И если этот член равен нулю, то это не связано с потерей значимости.

person Lutz Lehmann    schedule 15.03.2014

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

person user2566092    schedule 14.03.2014
comment
Итак, могу ли я исправить что-то в программе, чтобы округление было правильным? - person Oriol Prat; 15.03.2014
comment
@OriolPrat Ответ, который вы вычисляете с помощью своей формулы, уже верен с точностью до рабочей точности, просто округление арифметических операций с плавающей запятой приводит к тому, что квадратное уравнение немного ненулевое, когда вы подключаете найденное решение. Итак, вы ничего не можете сделать, чтобы округлить решения правильно, но когда вы проверяете решения, вы, безусловно, можете установить допуск, например 10 ^ (- 50), и вернуть, что решение правильное, если абсолютное значение уравнения меньше чем 10 ^ (- 50), когда вы подключаете свое решение. - person user2566092; 15.03.2014