Лабораторная работа № 8
Численные методы решения нелинейных алгебраических уравнений
Цели работы:
1. Изучение работы с анонимными и встраиваемыми функциями.
2. Решение нелинейных алгебраических уравнений с помощью функции fzero.
3. Разработка алгоритмического и программного обеспечения решения нелинейных алгебраических уравнений методами бисекций и Ньютона.
Продолжительность: 4 академических часа.
Встраиваемые и анонимные функции
Встраиваемая функция определяется при помощи функции inline, обращение к которой выглядит следующим образом:
Имя_функции = inline('формула', список_аргументов)
Список аргументов не обязателен, а 'формула' является текстовой строкой и задает выражение для вычисления значения функции.
Следующий пример демонстрирует создание в рабочей среде встраиваемой функции fun:
>> fun=inline('sin(x)-x.^2.*cos(x)')
fun =
Inline function:
fun(x) = sin(x)-x.^2.*cos(x)
Inline-фунция fun может быть использована как любая другая функция MATLAB, например:
>> y=fun(0.5)
y =
0.2600
Если функция зависит от нескольких переменных, то все они являются аргументами введенной inline-функции и располагаются в алфавитном порядке:
>> fun1=inline('sin(a*x)-x.^2.*cos(b*x)')
fun1 =
Inline function:
fun1(a,b,x) = sin(a*x)-x.^2.*cos(b*x)
Для изменения порядка аргументов их следует перечислить через запятые в списке после выражения, определяющего вид функции:
>> fun2=inline('sin(a*x)-x.^2.*cos(b*x)','x','a','b')
fun2 =
Inline function:
fun2(x,a,b) = sin(a*x)-x.^2.*cos(b*x)
Если в списке случайно пропущен хотя бы один из аргументов, то inline-функцией воспользоваться не удастся:
>> fun3=inline('sin(a*x)-x.^2.*cos(b*x)','x','b')
fun3 =
Inline function:
fun3(x,b) = sin(a*x)-x.^2.*cos(b*x)
Даже при наличии переменной а в рабочей среде вызов функции fun3 приведет к сообщению о том, что аргумент а не задан:
>> a=1;
>> fun3(5,0)
??? Error using ==> inlineeval at 15
Error in inline expression ==> sin(a*x)-x.^2.*cos(b*x)
Undefined function or variable 'a'.
Этот пример демонстрирует, что при вычислении значения встраиваемой функции переменные рабочей среды недоступны. Все аргументы функции inline должны быть символьными строками, заключенными в апострофы, или строковыми переменными. В противном случае получается недопустимая конструкция. Необходимо придерживаться простого правила — ставить апострофы в аргументах функции inline.
Альтернативный способ задания исследуемой функции состоит в объявлении анонимной функции с помощью оператора указателя @:
Имя_функции = @ (список_аргументов) формула
В отличие от inline-функции, и аргументы, и формула записываются в обычном виде, а не как текстовые строки в апострофах. Кроме того, анонимной функции доступны переменные рабочей среды, которые входят в формулу. Однако они являются константами, в качестве которых берутся значения этих переменных в момент создания анонимной функции, и последующее изменение их значений не будет учитываться при вычислении функции:
>> a=1;
>> gun3=@(x,b)(sin(a*x)-x.^2.*cos(b*x))
gun3 =
@(x,b)(sin(a*x)-x.^2.*cos(b*x))
>> gun3(5,0)
ans =
-25.9589
>> a=1000;
>> gun3(5,0)
ans =
-25.9589
По способу использования анонимная функция напоминает inline-функцию, но отличается тем, что создается указатель на функцию, который связан с исполняемым кодом. Это хорошо видно либо в окне Workspace, либо при выводе информации о функциях с помощью whos:
>> whos gun3
Name Size Bytes Class Attributes
gun3 1x1 16 function_handle
>> whos fun3
Name Size Bytes Class Attributes
fun3 1x1 910 inline
Информация о выделенной под функции памяти показывает, что для анонимной функции исполняемый код и указатель на нее отделены, а для inline-функции это единый объект.