- •Графики функций sin X и .
- •В чем заключается задача о численном решении уравнений
- •Задача о нахождении корня уравнения с заданной точностью.
- •Отделение корней
- •График функции
- •Графики, полученные при помощи plot (верхний) и fplot (нижний).
- •Различное число корней в зависимости от значения параметра .
- •Основные способы обращения к fzero
- •Способы задания уравнения для fzero
- •Графики функций
- •Решение уравнения, зависящего от параметров
- •Интерфейс fzero, получение информации о вычислениях, параметры вычислительного процесса
- •Выходные аргументы fzero
- •Входные аргументы fzero
- •Прерывание работы fzero, пример приложения с кнопкой Stop
Интерфейс fzero, получение информации о вычислениях, параметры вычислительного процесса
В предыдущих разделах мы в основном использовали самый простой способ вызова функции fzero одним выходным аргументом, в котором возвращается приближенное значение корня, и с двумя входными аргументами — функцией и начальным приближением или отрезком, на котором отделен корень.
Способы задания исследуемой функции в первом входном аргументе fzero достаточно подробно описаны в разделах Способы задания уравнения для fzero и Решение уравнения, зависящего от параметров. Сейчас мы обратимся к другим аргументам fzero, предполагая, что способ указания исследуемой функции может быть любой из следующих:
строковое выражением, заключенное в апострофы;
inline-функция;
указатель на функцию;
имя m-файла c функцией;
анонимная функцией;
вложенная функцией.
Выходные аргументы fzero
Функция fzero может быть вызвана с несколькими выходными аргументами. Если fzero вызвана с двумя выходными аргументами, то в первом возвращается приближенное значение корня, а во втором — соответствующее значение исследуемой функции. Пример:
>> [x,f] = fzero('exp(-x)-x', [0 1])
x =
0.5671
f =
1.1102e-016
Для получения информации о завершении работы функции fzero ее следует вызывать с тремя выходными аргументами
[x, f, exitflag] = fzero(...)
При этом значения третьего аргумента exitflag соответствуют следующим ситуациям:
exitflag = 1 — итерационный процесс нахождения корня сошелся к корню;
exitflag = -1 — алгоритм был прерван заданной пользователем функцией, которая вызывается на каждой итерации в fzero
(как запрограммировать такую функцию, написано в разделе Прерывание работы fzero, пример приложения с кнопкой Stop)
exitflag = -3 — при нахождении интервала, на границах которого исследуемая функция меняет знаки, значение функции оказалось Inf или NaN.
exitflag = -4 — при нахождении интервала, на границах которого исследуемая функция меняет знаки, значение функции оказалось комплексным.
exitflag = -5 — итерационный процесс сошелся, но возможно к точке, в которой функция имеет особенность.
Приведем несколько примеров, в которых возникают некоторые перечисленные выше ситуации.
В
этом примере
при
отделении корня fzero вышла за область
определения функции, т.к. подкоренное
выражение стало меньше нуля и exitflag = -4.
При этом в командное окно выводится еще
и соответствующее сообщение.
>> fun = inline('sqrt(x-pi)-x^2+10');
>> [x, f, exitflag] = fzero(fun, 3.2)
x =
NaN
f =
NaN
exitflag =
-4
В
следующем примере итерационный процесс
сошелся к точке разрыва функции
,
о чем свидетельствует значение exitflag.
>> [x, f, exitflag] = fzero('1/(x-sqrt(2))', [1 2])
x =
1.4142
f =
1.5012e+015
exitflag =
-5
Функция fzero ищет только те корни, в которых график исследуемой функции пересекает ось абсцисс, а не касается ее (см. раздел Отличие fzero от fsolve. Если во входном аргументе fzero указан не отрезок, а начальное приближение, то fzero начинает отделение корня, расширяя отрезок. В приведенном ниже примере при отделении корня значение функции x2вышло за допустимые в типе double границы и процесс отделения корня был остановлен. Выходной аргумент exitflag получил соответствующее значение.
>> [x, f, exitflag] = fzero('x^2', 1)
x =
NaN
f =
NaN
exitflag =
-3
При вызове fzero из командной строки вполне можно обойтись без выходного аргумента exitflag, поскольку в командное окно выводится сообщение о возникшей ситуации. Однако, если к fzero происходит обращение в ходе выполнения некоторого алгоритма и после вызова fzero требуется совершить действия, зависящие от достигнутого результата, то значение exitflag помогает организовать ветвление.
В самом общем случае функция fzero может быть вызвана с четырьмя выходными аргументами:
[x, f, exitflag, output] = fzero(…)
В последний из них output записывается информация о ходе вычислений. Аргумент output является структурой со следующими полями:
output.algorithm — использованные алгоритмы;
output.funcCount — сколько раз была вычислена исследуемая функция;
output.intervaliterations — число итераций, сделанное для отделения корня;
output.iterations — число итераций, сделанных для уточнения корня;
output.message — информация о завершении алгоритма.
Например, при нахождении корня уравнения x-cos x=0 с начальным приближением 1 выводится следующая информация
>> [x, f, exitflag, output] = fzero('x-cos(x)', 1)
x =
0.7391
f =
0
exitflag =
1
output =
intervaliterations: 8
iterations: 5
funcCount: 21
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [0.68, 1.22627]'
Из этой информации, в частности, следует, что корень был отделен за 8 итераций, а для уточнения корня применялись методы bisection (половинного деления) и interpolation (обратной квадратичной интерполяции, или линейной интерполяции). Про реализованные в fzero методы и алгоритм нахождения корня написано в разделе Алгоритм, по которому работает fzero.
Обратимся теперь к дополнительным входным аргументам, от которых может быть вызвана функция fzero. Эти входные аргументы позволяют управлять вычислительным процессом и отображаемой информацией.
