- •Графики функций sin X и .
- •В чем заключается задача о численном решении уравнений
- •Задача о нахождении корня уравнения с заданной точностью.
- •Отделение корней
- •График функции
- •Графики, полученные при помощи plot (верхний) и fplot (нижний).
- •Различное число корней в зависимости от значения параметра .
- •Основные способы обращения к fzero
- •Графики функций
- •Способы задания уравнения для fzero
- •Решение уравнения, зависящего от параметров
- •Интерфейс fzero, получение информации о вычислениях, параметры вычислительного процесса
- •Выходные аргументы fzero
- •Входные аргументы fzero
- •Прерывание работы fzero, пример приложения с кнопкой Stop
Различное число корней в зависимости от значения параметра .
Итак, в этом разделе мы обсудили некоторые способы отделения корней. В основном, мы ориентировались на графические способы. Они хороши своей наглядностью, однако на практике могут встретиться достаточно сложные функции, вычисление которых занимает много времени. Причем возможна такая ситуация, что для построения графика, позволяющего отделить корень, мы задействовали, скажем 100 точек, т.е. выполнили 100 вычислений функции, а для уточнения корня с достаточно хорошей точностью функцией fzero понадобилось всего 10 вычислений функции. Проблема становится особенно актуальной, когда функция вычисляется не за секунды, а за минуты или даже часы (пример — достаточно сложный интеграл, зависящий от параметра, для которого нужно определить значение параметра, обращающее интеграл в ноль).
В следующих разделах мы рассмотрим использование функции fzero для уточнения корня уравнения.
Основные способы обращения к fzero
Для уточнения корня в MATLAB предназначена функция fzero. В самом простом варианте существует два способа обращения к ней:
с указанием начального приближения к корню x0
x = fzero(fun, x0)
с указанием отрезка [a b], на котором отделен корень (см. предыдущий раздел Отделение корней)
x = fzero(fun, [a b])
Если работа алгоритма fzero окончится успешно, то в выходном аргументе x возвращается найденное приближенное к корню значение. По умолчанию, корень находится с точностью, близкой к машинной, т.е. порядка 10−16 .
Входной аргумент fun задает функцию. Он может быть строкой с выражением для функции, заключенной в апострофы, или inline-функцией, что удобно для достаточно простых функций. Кроме того, fun может быть:
указателем на функцию;
именем m-файла c функцией;
анонимной функцией;
вложенной функцией.
Эти варианты рассмотрены в разделе Способы задания уравнения для fzero. Сейчас мы обратимся к примерам, в которых исследуемые функции задаются несложными формулами и нам достаточно будет использовать наиболее простой способ задания исследуемой функции, например при помощи inline-функции.
Рассмотрим простой пример. Требуется решить уравнение
cos x − x = 0
Для
этого сначала отделяем корень. В нашем
примере он будет лежать на отрезке
,
т.к. корень — абсцисса точки пересечения
графиков функций
.
На границах этого отрезка функция
принимает значения разных знаков и это
существенно для начала работы fzero. Перед
вызовом fzero полезно установить формат
long e для того, чтобы видеть все значащие
цифры. Для этого выполняем команду
format long e
(или в меню File выбираем пункт Preferences, в левой части окна Preferences переходим к разделу Command Window, а в правой части в списке Numeric format выбираем long e).
Теперь определим inline-функцию
fun = inline('cos(x)-x');
и вызовем fzero для нахождения корня.
x = fzero(fun, [0 pi/2])
Получаем
x =
7.390851332151607e-001
Для проверки того, что корень найден с точностью 10−16 можно воспользоваться простым, но эффективным способом, а именно вычислить значения функции в точках x + 10−16 и x − 10−16 . Если знаки функции в этих точках различны, то точный корень находится на расстоянии не больше 10−16 от найденного значения x.
fun(x-1e-16)
ans =
1.110223024625157e-016
fun(x+1e-16)
ans =
-2.220446049250313e-016
Проверка показала, что знаки разные, следовательно корень найден с точностью 10−16 .
При указании функции fzero отрезка, на котором отделен разыскиваемый корень, важно, чтобы на границах этого отрезка функция принимала значения разных знаков. Если в приведенном выше примере попытаться вызвать fzero от отрезка [1, 2], то функция fzero выдаст сообщение об ошибке, говорящее о необходимости указания отрезка, на границах которого исследуемая функция принимает значения различных знаков.
x = fzero(fun, [1 2])
??? Error using ==> fzero
The function values at the interval endpoints must differ in sign.
Найдем теперь приближенное значение корня, указав функции fzero не отрезок, а начальное приближение к корню, например 1.
x = fzero(fun, 1)
x =
7.390851332151607e-001
Корень снова найден, поскольку функция fzero сначала определила отрезок, на границах которого функция принимает значения разных знаков, а затем уточнила его с машинной точностью. Но этот пример может создать ошибочное представление, что так будет всегда при указании начального приближения, а не отрезка.
Рассмотрим другой пример, в котором требуется решить уравнение
В
принципе ясно, что у данного уравнения
корень только один, т.к. корень это
абсцисса точки пересечения
функций
и h ( x )
= x2 −
10 . Построим графики функций g ( x )
и h ( x )
, например на отрезке [Π,3.5]
:
figure
fplot('sqrt(x-pi)', [pi 3.5])
hold on
fplot('x^2-10', [pi 3.5], 'r')
grid on
