- •Графики функций sin X и .
- •В чем заключается задача о численном решении уравнений
- •Задача о нахождении корня уравнения с заданной точностью.
- •Отделение корней
- •График функции
- •Графики, полученные при помощи plot (верхний) и fplot (нижний).
- •Различное число корней в зависимости от значения параметра .
- •Основные способы обращения к fzero
- •Графики функций
- •Способы задания уравнения для fzero
- •Решение уравнения, зависящего от параметров
- •Интерфейс fzero, получение информации о вычислениях, параметры вычислительного процесса
- •Выходные аргументы fzero
- •Входные аргументы fzero
- •Прерывание работы fzero, пример приложения с кнопкой Stop
Решение уравнения, зависящего от параметров
В этом разделе речь пойдет про решение уравнений вида
f(x;a1,a2,...,an)=0.
Т.е. предполагается, что функция зависит от одного или нескольких параметров, при заданных значениях которых необходимо найти корень уравнения. Для решения таких уравнений можно воспользоваться несколькими способами задания функции, зависящей от параметров. Основные из них изложены в справочной системе в разделах:
MATLAB: Mathematics: Function Functions: Parameterizing Functions Called by Function Functions: Providing Parameter Values to Anonymous Functions;
MATLAB: Mathematics: Function Functions: Parameterizing Functions Called by Function Functions: Providing Parameter Values Using Nested Functions;
Первый из них связан с анонимными функциями. В разделе Способы задания уравнения для fzeroзадействовали их для задания уравнений вида f(x)=0. Теперь рассмотрим, как анонимные функции могут быть применены для решения уравнений, в которые входят параметры.
Для примера возьмем простое уравнение
Анонимную функцию (зависящую только от x) можно определить так
f = @(x) exp(a1*x) - a2;
Важно только, чтобы до определения анонимной функции a1 и a2 были уже заданы. Т.е. последовательность команд
>> a1 = 1;
>> a2 = 2;
>> f = @(x) exp(a1*x) - a2;
приводит к корректному определению функции (в данном примере для a1=1 и a2=2). Заметим, что при a2> 0 у данного уравнения есть только один корень. В принципе, теперь можно использовать функцию fzero для уточнения корня
>> x = fzero(f, 0)
x =
0.6931
Однако, для каждой новой пары параметров придется заново присваивать их значения переменным и определять анонимную функцию перед вызовом fzero. Удобнее поступить следующим образом — запрограммировать функцию, у которой входные аргументами будут параметры, а выходной — значение корня. Текст этой функции solvepar приведен ниже (считаем, что она сохранена в файле solvepar.m, который находится в текущем каталоге, или путь к нему известен MATLAB).
function x = solvepar(a1, a2)
f = @(x) exp(a1*x) - a2;
x = fzero(f, 0);
При наличии такой функции поиск корня для заданного параметра состоит только в вызове solvepar от заданной пары аргументов, например:
>> x = solvepar(1,2)
x =
0.6931
>> x = solvepar(1.5,2)
x =
0.4621
и т.д.
Еще один способ задания уравнения, который мы рассмотрим на примере предыдущего уравнения, состоит в использовании вложенных функций. Вложенная функция размещается внутри основной и имеет доступ к переменным основной функции (подробно про вложенные функции написано в разделе справочной системы MATLAB: Programming: Types of Functions: Nested Functions).
В следующем примере основная функция solvenest содержит вложенную функцию fun (будем считать, что функция вместе с вложенной подфункцией сохранены в файле solvenest.m, который находится в текущем каталоге, или путь к нему известен MATLAB).
function x = solvenest(a1, a2)
function f = fun(x)
f = @(x) exp(a1*x) - a2;
end
x = fzero(fun, 0);
end
При наличии вложенных функций обязательно завершать и вложенные и основную функции ключевым словом end. Во вложенной функции fun значения a1 и a2 известны, поскольку они являются входными аргументами основной функции solvenest. Вызов fzero происходит в основной функции, сама fzero обращается ко вложенной со значениями параметров, переданными основной функции solvenest. Для поиска корней достаточно вызвать функцию solvenest от значений параметров:
>> x = solvenest(1,2)
x =
0.6931
>> x = solvenest(1.5,2)
x =
0.4621
и т.д.
В качестве еще одного варианта задания функции в fzero рассмотрим подход, который был принят в более ранних чем 7-ая версиях MATLAB и поддерживается в 7-ой версии. Этот подход основан на том, что программируется функция, аргументами которой являются независимая переменная и параметры. В случае, например уравнения
соответствующая функция выглядит следующим образом (считаем, что функция myfun сохранена в файле myfun.m, который находится в текущем каталоге, или путь к нему известен MATLAB)
function f = myfun(x, a1, a2)
f = exp(a1*x) - a2;
Далее, при вызове fzero значения параметров указываются начиная с четвертого входного аргумента в той же последовательности, что и в заголовке функции myfun:
>> x = fzero(@myfun, 0, [], 1, 2)
x =
0.6931
Почему вместо третьего входного аргумента в fzero стоят пустые квадратные скобки, будет понятно при чтении следующего раздела, в котором подробно рассматривается интерфейс fzero, т.е. назначение всех ее возможных входных и выходных аргументов.
