Встраиваемые и анонимные функции

Лабораторная работа № 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-функции это единый объект.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: