Elettracompany.com

Компьютерный справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Задание функции в matlab

Matlab функции

В программе MATLAB вы будете использовать как встроенные функции, так и
Matlab функции, созданные вами.

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

Программа MATLAB имеет много встроенных функций. В их число входят
функции sqrt, cos, sin, tan, log, exp и atan (для функции арктангенс), а также
более специализированные математические функции, такие как gamma, erf и besselj. Программа MATLAB имеет также некоторые встроенные константы,
включая pi (число п), i (комплексное число i = корень(-1)) и Inf (°° — бесконечность). Ниже показано несколько примеров:

Функция log является натуральным логарифмом и во многих текстах называется In.

Функции, задаваемые пользователем

В этом разделе мы проверим два способа задания ваших собственных функций в
программе MATLAB. Первый способ использует команду inline, а второй
использует оператор @, чтобы создать так называемую «анонимную функцию».
Второй метод является новым в программе MATLAB 7, и в настоящее время этому
методу отдается предпочтение. Периодически мы будем упоминать о команде
inline ради пользователей более ранних версий программы. Однако мы
настоятельно рекомендуем пользователям MATLAB 7 и пользователям более ранних
версий, когда они обновят программу, использовать оператор @ в качестве
обычного метода для задания функций. Функции можно также задавать в
отдельных файлах, которые называются М-файлами (см. главу 3).
В этом примере показано, как задается функция f (x) = х 2 с использованием
этих команд.

Можно сделать и по-другому:

f1 =
Inline function:
f1(x) = х^2

Когда функция задана, не важно каким методом, вы можете ее вычислить, например:

Как мы отмечали ранее, большинство функций программы MATLAB могут
оперировать как векторами, так и скалярами. Чтобы быть уверенным, что заданная
вами функция может оперировать с векторами, вставляйте точки перед
математическими операторами .* ./ и .^ Таким образом, чтобы получить векторизованную версию функции f (x) = х 2 , введите строку

Теперь мы можем вычислить любую функцию для вектора, например:

ans =
1 4 9 16 25

Используя графические возможности программы MATLAB, вы можете начертить
графики функций f и f1. Это можно сделать несколькими способами, которые
мы рассмотрим в разделе «Графика» далее в этом уроке. В завершении этого
раздела отметим, что функции можно также задавать с двумя или более
переменными. Например, решение любой из этих функций

g = @(x, y) x^2 + y^2; g (1, 2);
g1 = inline (‘x^2 + y^2’, ‘x’, ‘y’); g1 (1, 2)

даст ответ 5. Если вместо этого вы зададите функцию следующим образом

тогда вы сможете вычислить векторы; таким образом, выполнение следующего
выражения

дает значения функции в точках (1, 3) и (2, 4).

Поэтому из выше всего сказанного можно сделать вывод, что вам необходимо просмотреть много дополнительной информации и альтернатив!

MATLAB Language Анонимные функции и функции

пример

основы

Анонимные функции являются мощным инструментом языка MATLAB. Это функции, которые существуют локально, то есть: в текущей рабочей области. Однако они не существуют на пути MATLAB, как регулярная функция, например, в m-файле. Вот почему они называются анонимными, хотя они могут иметь имя как переменную в рабочей области.

Оператор @

Используйте оператор @ для создания анонимных функций и функций. Например, чтобы создать дескриптор функции sin (sine) и использовать его как f :

Теперь f является дескриптором функции sin . Как и в реальной жизни, дверная ручка — это способ использовать дверь, функциональная рукоятка — это способ использовать функцию. Для использования f аргументы передаются ему, как если бы это была функция sin :

f принимает любые входные аргументы, которые принимает функция sin . Если sin будет функцией, которая принимает нулевые входные аргументы (а это не так, но другие делают, например, функцию peaks ), f() будет использоваться для вызова без входных аргументов.

Пользовательские анонимные функции

Анонимные функции одной переменной

Очевидно, не полезно создавать дескриптор существующей функции, такой как sin в приведенном выше примере. В этом примере он является избыточным. Тем не менее, полезно создавать анонимные функции, которые выполняют пользовательские вещи, которые в противном случае нужно было бы повторять несколько раз или создавать отдельную функцию. В качестве примера пользовательской анонимной функции, которая принимает одну переменную в качестве ее ввода, суммируйте синус и косинус в квадрате сигнала:

Теперь f принимает один входной аргумент, называемый x . Это было задано с помощью круглых скобок (. ) непосредственно после оператора @ . f теперь является анонимной функцией x : f(x) . Он используется, передавая значение x в f :

Вектор значений или переменная также может быть передан в f , если они действительным образом используются внутри f :

Анонимные функции более чем одной переменной

Таким же образом анонимные функции могут быть созданы, чтобы принимать более одной переменной. Пример анонимной функции, которая принимает три переменные:

Параметрирование анонимных функций

Переменные в рабочей области могут использоваться в определении анонимных функций. Это называется параметризацией. Например, для использования константы c = 2 в анонимной функции:

f(3) использовала переменную c как параметр для умножения с предоставленным x . Обратите внимание, что если значение c в этой точке задано на что-то другое, тогда вызывается f(3) , результат не будет отличаться. Значение c является значением во время создания анонимной функции:

Входные аргументы для анонимной функции не относятся к переменным рабочего пространства

Обратите внимание, что использование имени переменных в рабочей области в качестве одного из входных аргументов анонимной функции (т. Е. С помощью @(. ) ) не будет использовать значения этих переменных. Вместо этого они рассматриваются как разные переменные в рамках анонимной функции, то есть: анонимная функция имеет свое личное рабочее пространство, где входные переменные никогда не ссылаются на переменные из основного рабочего пространства. Основное рабочее пространство и рабочая область анонимной функции не знают друг о друге. Пример, иллюстрирующий это:

Читать еще:  Матрица поворота matlab

Значение x из основного рабочего пространства не используется в f . Кроме того, в основной рабочей области x осталось нетронутым. В пределах области f имена переменных между круглыми скобками после оператора @ не зависят от основных переменных рабочей области.

Анонимные функции хранятся в переменных

Анонимная функция (или, точнее, дескриптор функции, указывающая на анонимную функцию) сохраняется как любое другое значение в текущем рабочем пространстве: в переменной (как мы это делали выше) в массиве ячеек ( <@(x)x.^2,@(x)x+1>) или даже в свойстве (например, h.ButtonDownFcn для интерактивной графики). Это означает, что анонимную функцию можно рассматривать как любое другое значение. Когда он хранится в переменной, он имеет имя в текущей рабочей области и может быть изменен и очищен так же, как переменные, содержащие числа.

По-разному: дескриптор функции (будь то в форме @sin или для анонимной функции) — это просто значение, которое может быть сохранено в переменной, подобно цифровой матрице.

Расширенное использование

Передающая функция обрабатывает другие функции

Поскольку дескрипторы функций обрабатываются как переменные, они могут быть переданы в функции, которые принимают дескрипторы функций в качестве входных аргументов.

Пример: функция создается в m-файле, который принимает дескриптор функции и скалярное число. Затем он вызывает дескриптор функции, передавая ему 3 а затем добавляет скалярное число к результату. Результат возвращается.

Сохраните его где-нибудь на пути, например, в текущей папке MATLAB. Теперь funHandleDemo можно использовать следующим образом, например:

Рукоятка другой существующей функции может быть передана funHandleDemo :

Обратите внимание, что @sin был быстрым способом получить доступ к функции sin без предварительного ее хранения в переменной, используя f = @sin .

Использование bsxfun , cellfun и подобных функций с анонимными функциями

MATLAB имеет встроенные функции, которые принимают анонимные функции в качестве входных данных. Это способ выполнить многие вычисления с минимальным количеством строк кода. Например, bsxfun , который выполняет bsxfun двоичные операции, то есть: он применяет функцию по двум векторам или матрицам bsxfun . Обычно для этого требуется использование for -loops, для которого часто требуется предварительное распределение скорости. Используя bsxfun этот процесс ускоряется. Следующий пример иллюстрирует это, используя tic и toc , две функции, которые можно использовать для временного использования кода. Он вычисляет разницу между каждым элементом матрицы из среднего значения столбца.

Выполнение приведенного выше примера приводит к двум выходам:

Эти строки поступают от функций toc , которые печатают прошедшее время со времени последнего вызова функции tic .

bsxfun применяет функцию в первом аргументе ввода к двум другим входным аргументам. @minus — это длинное имя для той же операции, что и знак минуса. Возможно, была указана другая анонимная функция или дескриптор ( @ ) для любой другой функции, если она принимает A и mean(A) качестве входных данных для создания значимого результата.

Специально для больших объемов данных в больших матрицах bsxfun может значительно ускорить работу. Он также делает код более чистым, хотя его может быть труднее интерпретировать для людей, которые не знают MATLAB или bsxfun . (Обратите внимание, что в MATLAB R2016a и более поздних версиях многие операции, которые ранее использовали bsxfun больше не нуждаются в них, A-mean(A) работает напрямую и может в некоторых случаях быть еще быстрее.)

Основные математические функции MatLab

MatLab содержит в себе все распространенные математические функции, которые доступны по их имени при реализации алгоритмов. Например, функция sqrt() позволяет вычислять квадрат числа и может быть использована в программе следующим образом:

x = 2;
y = 4;
d = sqrt(x^2+y^2); %вычисление евклидового расстояния

Аналогичным образом вызываются и все другие математические функции, представленные в табл. 1.2.

Таблица 1.2. Основные математические функции MatLab

Почти все элементарные функции допускают вычисления и с комплексными аргументами. Например:

res = sin(2+3i)*atan(4i)/(1 — 6i); % res = -1.8009 — 1.9190i

Ниже показан пример задания вектора с именем a, и содержащий значения 1, 2, 3, 4:

a = [1 2 3 4]; % вектор-строка

Для доступа к тому или иному элементу вектора используется следующая конструкция языка:

disp( a(1) ); % отображение значения 1-го элемента вектора
disp( a(2) ); % отображение значения 2-го элемента вектора
disp( a(3) ); % отображение значения 3-го элемента вектора
disp( a(4) ); % отображение значения 4-го элемента вектора

т.е. нужно указать имя вектора и в круглых скобках написать номер индекса элемента, с которым предполагается работать. Например, для изменения значения 2-го элемента массива на 10 достаточно записать

a(2) = 10; % изменение значения 2-го элемента на 10

Часто возникает необходимость определения общего числа элементов в векторе, т.е. определения его размера. Это можно сделать, воспользовавшись функцией length() следующим образом:

Читать еще:  Php domdocument loadxml

N = length(a); % (N=4) число элементов массива а

Если требуется задать вектор-столбец, то это можно сделать так

a = [1; 2; 3; 4]; % вектор-столбец

b = [1 2 3 4]’; % вектор-столбец

при этом доступ к элементам векторов осуществляется также как и для векторов-строк.

Следует отметить, что векторы можно составлять не только из отдельных чисел или переменных, но и из векторов. Например, следующий фрагмент программы показывает, как можно создавать один вектор на основе другого:

a = [1 2 3 4]; % начальный вектор a = [1 2 3 4]
b = [a 5 6]; % второй вектор b = [1 2 3 4 5 6]

Здесь вектор b состоит из шести элементов и создан на основе вектора а. Используя этот прием, можно осуществлять увеличение размера векторов в процессе работы программы:

a = [a 5]; % увеличение вектора а на один элемент

Недостатком описанного способа задания (инициализации) векторов является сложность определения векторов больших размеров, состоящих, например, из 100 или 1000 элементов. Чтобы решить данную задачу, в MatLab существуют функции инициализации векторов нулями, единицами или случайными значениями:

a1 = zeros(1, 100); % вектор-строка, 100 элементов с
% нулевыми значениями
a2 = zeros(100, 1); % вектор-столбец, 100 элементов с
% нулевыми значениями
a3 = ones(1, 1000); % вектор-строка, 1000 элементов с
% единичными значениями
a4 = ones(1000, 1); % вектор-столбец, 1000 элементов с
% единичными значениями
a5 = rand(1000, 1); % вектор-столбец, 1000 элементов со
% случайными значениями

Матрицы в MatLab задаются аналогично векторам с той лишь разницей, что указываются обе размерности. Приведем пример инициализации единичной матрицы размером 3х3:

E = [1 0 0; 0 1 0; 0 01]; % единичная матрица 3х3

E = [1 0 0
0 1 0
0 0 1]; % единичная матрица 3х3

Аналогичным образом можно задавать любые другие матрицы, а также использовать приведенные выше функции zeros(), ones() и rand(), например:

A1 = zeros(10,10); % нулевая матрица 10х10 элементов

A2 = zeros(10); % нулевая матрица 10х10 элементов
A3 = ones(5); % матрица 5х5, состоящая из единиц
A4 = rand(100); % матрица 100х100, из случайных чисел

Для доступа к элементам матрицы применяется такой же синтаксис как и для векторов, но с указанием строки и столбца где находится требуемый элемент:

A = [1 2 3;4 5 6;7 8 9]; % матрица 3х3
disp( A(2,1) ); % вывод на экран элемента, стоящего во
% второй строке первого столбца, т.е. 4
disp( A(1,2) ); % вывод на экран элемента, стоящего в
% первой строке второго столбца, т.е. 2

Также возможны операции выделения указанной части матрицы, например:

B1 = A(:,1); % B1 = [1; 4; 7] – выделение первого столбца
B2 = A(2,:); % B2 = [1 2 3] – выделение первой строки
B3 = A(1:2,2:3); % B3 = [2 3; 5 6] – выделение первых двух
% строк и 2-го и 3-го столбцов матрицы А.

Размерность любой матрицы или вектора в MatLab можно определить с помощью функции size(), которая возвращает число строк и столбцов переменной, указанной в качестве аргумента:

a = 5; % переменная а
A = [1 2 3]; % вектор-строка
B = [1 2 3; 4 5 6]; % матрица 2х3
size(a) % 1х1
size(A) % 1х3
size(B) % 2х3

Вычисление производной и экстремумов функции в Matlab

Вычисление производной функции

В библиотеке Matlab есть специальная функция diff , которая выполняет аппроксимацию производных конечными разностями. Она имеет несколько синтаксических конструкций:
diff(X) — возвращает конечные разности смежных элементов массива X. Если X — вектор, то diff(X) возвращает вектор разностей соседних элементов [Х(2)-Х(1) Х(3)-Х(2) . X(n)-X(n-D], у которого количество элементов на единицу меньше, чем у исходного вектора X.
Если X — матрица, то diff(X) возвращает матрицу разностей столбцов: [X(2:m, :)-X(l:m-l. :)];
diff(X,n,dim) — возвращает конечные разности для матрицы X по строкам или по столбцам в зависимости от значения параметра dim. Если порядок n равен величине dim или превышает ее, то diff возвращает пустой массив.

Пример. Применяя функцию diff, вычислим производную функции

Введем идентификаторы переменных:
x – переменная для хранения значения величины аргумента x, для которого вычисляется производная функции,
dx – переменная для хранения конечного приращения,
Y — переменная для хранения вычисленных значений функции,
D — переменная для хранения вычисленного значения производной.
Код инструкции и полученный результат приведены ниже (рис. 1).

Вычисление локальных экстремумов

Напомним, что функция Y=f(x ) имеет экстремум в точке Х , если производная функции в этой точке равна нулю.

Задача вычисления локальных экстремумов исследуемой (целевой) функции в Matlab сводится к вычислению значения ее аргумента, при котором функция принимает минимальное (максимальное) значение с последующей проверкой существования экстремума путем вычисления производной в найденной точке.

Для решения первой задачи в системе Matlab используется функция [X.fval.exitflag,output] = fminbnd(@fun.x1,x2.options, p1,p2. ) , имеющая следующие синтаксические конструкции:
fminbnd(@fun,xl,x2) — возвращает значение х , которое является локальным минимумом функции fun(x) на интервале xl > options=optimset(‘tolX’,1.е-10);
[x]=fminbnd(@cos.3,4,options)
х = 3.1416

Для вычисления экстремума функции y= x^2+x +2 выполним следующие операции:
— так как исследуемая функция в параметре функции fminbnd Matlab указывается в форме дескриптора, то создадим m-файл с кодом функции:

% функция y= x^2+x +2
function urav=fun1(x)
urav=x.^2+x +2;

— сохраним файл, присвоив ему имя fun1.m (рис. 2);

— чтобы выяснить, являются экстремумы исследуемой функции максимумами или минимумами, построим в заданном интервале x ее график (рис. 3), введя в командном окне инструкцию
>> fplot(@fun1, [-1 1]); grid on

Читать еще:  Php mysql where несколько условий

На графике видно, что примерно при x = -0,5 исследуемая функция имеет минимум;
— в командном окне Matlab введем код инструкции для вычисления минимума функции:

На рис. 4 показан результат в командном окне.

— вычислим производную исследуемой функции в точке x =-0,5, для этого в командном окне Matlab введем инструкцию:

Результат представлен в командном окне (рис. 5).

Полученное значение производной исследуемой функции в точке x = -0,5 равно нулю, следовательно, в этой точке функция имеет локальный экстремум.

Задание функции в matlab

2. Синтаксис определения и вызова M-функций .

Текст M-функции должен начинаться с заголовка , после которого следует тело функции .

Заголовок определяет » интерфейс» функции ( способ взаимодействия с ней ) и устроен следующим образом:

function [ RetVal1, RetVal2, ] = FunctionName( par1, par2, )

Здесь провозглашается функция ( с помощью неизменного «ключевого» слова function ) с именем FunctionName, которая принимает входные параметры par1, par2, , и вырабатывает ( вычисляет ) выходные ( возвращаемые ) значения RetVal1, RetVal2

По-другому говорят, что аргументами функции являются переменные par1, par2. а значениями функции ( их надо вычислить ) являются переменные RetVal1, RetVal2, .

Указанное в заголовке имя функции (в приведённом примере — FunctionName) должно служить именем файла, в который будет записан текст функции. Для данного примера это будет файл FunctionName.m ( расширение имени, по-прежнему, должно состоять лишь из одной буквы m ). Рассогласования имени функции и имени файла не допускается!

Тело функции состоит из команд, с помощью которых вычисляются возвращаемые значения. Тело функции следует за заголовком функции. Заголовок функции плюс тело функции в совокупности составляют определение функции.

Как входные параметры, так и возвращаемые значения могут быть в общем случае массивами ( в частном случае — скалярами ) различных размерностей и размеров. Например, функция MatrProc1

function [ A, B ] = MatrProc1( X1, X2, x )

A = X1 .* X2 * x;

B = X1 .* X2 + x;

рассчитана на «приём» двух массивов одинаковых ( но произвольных ) размеров и одного скаляра.

Эти массивы в теле функции сначала перемножаются поэлементно, после чего результат такого перемножения ещё умножается на скаляр. Таким образом порождается первый из выходных массивов. Одинаковые размеры входных масивов X1 и X2 гарантируют выполнимость операции их поэлементного умножения. Второй выходной массив ( с именем B ) отличается от первого тем, что получается сложением со скаляром ( а не умножением ).

Вызов созданной нами функции осуществляется из командного окна системы MATLAB (или из текста какой-либо другой функции ) обычным образом: записывается имя функции, после которого в круглых скобках через запятую перечисляются фактические входные параметры , со значениями которых и будут произведены вычисления. Фактические параметры могут быть заданы числами ( массивами чисел ), именами переменных, уже имеющими конкретные значения, а также выражениями.

Если фактический параметр задан именем некоторой переменной, то реальные вычисления будут производиться с копией этой переменной ( а не с ней самой ). Это называется передачей параметров по значению .

Ниже показан вызов из командного окна MATLABа ранее созданной нами для примера функции MatrProc1.

Здесь имена фактических входных параметров ( W1 и W2 ) и переменных, в которых записываются результаты вычислений ( Res1 и Res2 ), не совпадают с именами аналогичных переменных в определении функции MatrProc1. Очевидно, что совпадения и не требуется, тем более, что у третьего входного фактического параметра нет имени вообще! Чтобы подчеркнуть это возможное отличие, имена входных параметров и выходных значений в определении функции называют формальными.

В рассмотренном примере вызова функции MatrProc1 из двух входных квадратных матриц 2 x 2 получаются две выходные матрицы Res1 и Res2 точно таких же размеров:

Res1 =
9 6
6 6

Res2 =
6 5
5 5

MatrProc1 [r1,r2] = MatrProc1( [ 1 2 3; 4 5 6 ], [ 7 7 7; 2 2 2 ], 1 );

с двумя входными массивами размера 2×3, получим две выходные матрицы размера 2×3. То есть, одна и та же функция MatrProc1 может обрабатывать входные параметры различных размеров и размерностей! Можно вместо массивов применить эту функцию к скалярам ( это всё равно массивы размера 1×1 ).

Теперь рассмотрим вопрос о том, можно ли использовать эту функцию в составе выражений так, как это делается с функциями, возвращающими единственное значение? Оказывается это делать можно, причём в качестве значения функции, применяемого для дальнейших вычислений, используется первое из возвращаемых функцией значений. Следующее окно системы MATLAB иллюстрирует это положение:

При вызове с параметрами 1,2,1 функция MatrProc1 возвращает два значения: 2 и 3. Для использования в составе выражения используется первое из них.

Так как вызов любой функции можно осуществить, написав произвольное выражение в командном окне MATLABа, то всегда можно совершить ошибку, связанную с несовпадением типов фактических и формальных параметров. MATLAB не выполняет никаких проверок на эту тему, а просто передаёт управление функции. В результате могут возникнуть ошибочные ситуации. Чтобы избежать ( по-возможности ) возникновения таких ошибочных ситуаций, предлагается в тексте M-функций осуществлять проверку входных параметров. Например, в функции MatrProc1 легко осуществить выявление ситуации, когда размеры первого и второго входных параметров различны. Для написания такого кода требуются конструкции управления, которые мы пока ещё не изучали. Самое время приступить к их изучению!

Ссылка на основную публикацию
Adblock
detector