Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение уравнений.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
480 Кб
Скачать
☆

Интерфейс 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. Эти входные аргументы позволяют управлять вычислительным процессом и отображаемой информацией.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]