М-файл сохранен как test1.m
Пример 2. Предыдущий пример оформить в виде М-функции с именем fun1.
В дальнейшем будем предполагать, что М-файлы создаются в текстовом редакторе MATLAB. Поэтому программный код оформим в следующем виде:
function [p0,p1,p2,p3,p4,p5] = fun1(L, t) % Расчет вероятностей количества требований % в простейшем потоке Пуассона p0 = (L*t)^0/factorial(0)*exp(-L*t); p1 = (L*t)^1/factorial(1)*exp(-L*t); p2 = (L*t)^2/factorial(2)*exp(-L*t); p3 = (L*t)^3/factorial(3)*exp(-L*t); p4 = (L*t)^4/factorial(4)*exp(-L*t); p5 = (L*t)^5/factorial(5)*exp(-L*t); end |
Результат обращения к созданной М-функции из командного окна системы MATLAB:
>> [P0,P1,P2,P3,P4,P5] = fun1(1.23, 2.34)
P0 =
0.0562
P1 =
0.1619
P2 =
0.2329
P3 =
0.2235
P4 =
0.1608
P5 =
0.0926
Задание 1
1. Создайте функцию, аргументами которой будут год и месяц вашего рождения, а возвращаемым значением был бы календарь заданного года и месяца. Обращение к созданной функции выполните из М-сценария, в котором задайте год и месяц своего рождения.
2. Напишите М-функцию, которая бы возвращала сумму элементов данной строки и данного столбца магического квадрата, размерность которого должна быть входным аргументом М-функции.
Пример 3. Написать М-функцию, которая содержит две подфункции. Одна подфункция служит для расчета суммы кубического корня заданного вектора вещественных чисел, другая для поэлементного перемножения двух матриц заданного размера.
Программный код решения примера
function [S, C] = fun3(X, A, B) % Главная М-функция % Аргументы функции fun3: % X – числовой вектор % A, B – числовые прямоугольные матрицы одинакового размера % Возвращаемые значения: % S – сумма из корня кубического элементов вектора Х % C – результат поэлементного произведения двух матриц A и B % Обращение к подфункциям с фактическими параметрами S = sum(funs(X)); C = funt(A, B); end function f = funs(Y) %% М-подфункция извлечения корня кубического %% из элементов заданного вектора f = sign(Y).*abs(Y).^(1/3); % см. help sign, help abs end function F = funt(A, B) %% М-подфункция поэлементного произведения %% двух матриц F = A.*B; end |
Пример выполнения программы при обращении к М-функции fun3 из командной строки:
|
>> [s,c] = fun3([1, 27,-19683], [1,2;3,4], [6,7;8,9])
s =
-23.0000
c =
6 14
24 36
Пример 4. Написать М-функцию, которая обеспечивает сложение векторов неизвестного заранее количества.
В общем случае для решения этого примера требуется использование операторов цикла. Здесь будет показано, какие средства используются для определения переменного количество аргументов М-функции.
Программный код решения примера для сложения трех векторов
function f = funvar3(varargin) % М-функция с переменным количеством входных аргументов % ключевое слово varargin %% Определение количество входных аргументов n = length(varargin); %% обращение к вектору с помощью класса ячейки {} f = varargin{1} + varargin{2} + varargin{3}; end |
Пример выполнения программы при обращении к М-функции funvar3 из командной строки:
>> s = funvar4([1,2], [4,5], [6,7])
s =
11 14
При определении М-функции используется ключевое слово varargin, а при обращении к функции используются фактические параметры – векторы. Обращение к заданному по номеру вектору происходит через фигурные скобки, которые формируют массив ячеек – класс cell. Обычно код подобных М-функций содержит операторы цикла и условия, с которыми познакомимся в следующих лабораторных работах.
|
Пример 5. Написать М-функцию, которая возвращает переменное количество измеряемых значений массива, если на вход функции подается массив заранее неизвестного размера и размерности.
Для этого примера в общем случае требуется использование операторов цикла. Для демонстрации возможности переменного количества возвращаемых значений используем трехмерный массив размера 2´2´3.
Программный код решения примера
function varargout = outvar(M) % М-функция с переменным количеством % возвращаемых значений % ключевое слово varargout % Определение количества размерностей массива n = ndims(M); varargout(1) = {size(M, 1)}; varargout(2) = {size(M, 2)}; varargout(3) = {size(M, 3)}; end |
Пример выполнения программы:
>> A = rand(3,4); B = randn(3,4);
>> C(:,:,1) = A; C(:,:,2) = B;
>> C
C(:,:,1) =
0.4218 0.9595 0.8491 0.7577
0.9157 0.6557 0.9340 0.7431
0.7922 0.0357 0.6787 0.3922
C(:,:,2) =
1.0668 -0.8323 0.7143 0.8580
0.0593 0.2944 1.6236 1.2540
-0.0956 -1.3362 -0.6918 -1.5937
>> [n1, n2, n3] = outvar(C)
n1 =
n2 =
n3 =
Задание 2
1. Напишите М-функцию с подфункцией вычисления логарифма числа по основаниям 3 и 5. Входным аргументом главной (основной) М-функции примите одномерный массив чисел.
Пример 6. Написать М-функцию для перестановки строк прямоугольной матрицы вещественных чисел.
Программный код решения примера
function M = swapR(M, n, m) % Аргументы функции (формальные параметры): % M - матрица вещественных чисел произвольного размера % n - номер строки % m - номер строки % В матрице М переставляются строки с номерами n и m % Возвращаемое значение (формальный параметр): % M - матрица, в которой переставлены строки с номерами n и m temp = M(n,:); M(n,:) = M(m,:); M(m,:) = temp; end %% end of function |
|
Возможный результат выполнения программы в командном окне MATLAB:
>> % Матрица нормально распределенных случайных чисел
>> q = randn(7, 6)
q =
1.0347 -1.0689 -1.7115 -0.1649 -1.1135 -1.0891
0.7269 -0.8095 -0.1022 0.6277 -0.0068 0.0326
-0.3034 -2.9443 -0.2414 1.0933 1.5326 0.5525
0.2939 1.4384 0.3192 1.1093 -0.7697 1.1006
-0.7873 0.3252 0.3129 -0.8637 0.3714 1.5442
0.8884 -0.7549 -0.8649 0.0774 -0.2256 0.0859
-1.1471 1.3703 -0.0301 -1.2141 1.1174 -1.4916
>> % Переставим 2 и 5 строки
>> m = swapR(q, 2, 5)
m =
1.0347 -1.0689 -1.7115 -0.1649 -1.1135 -1.0891
-0.7873 0.3252 0.3129 -0.8637 0.3714 1.5442
-0.3034 -2.9443 -0.2414 1.0933 1.5326 0.5525
0.2939 1.4384 0.3192 1.1093 -0.7697 1.1006
0.7269 -0.8095 -0.1022 0.6277 -0.0068 0.0326
0.8884 -0.7549 -0.8649 0.0774 -0.2256 0.0859
-1.1471 1.3703 -0.0301 -1.2141 1.1174 -1.4916
Задание 3
1. Напишите М-функцию для перестановки столбцов прямоугольной матрицы вещественных чисел. Протестируйте ее.
2. Напишите М-функцию для перестановки строк прямоугольной матрицы, состоящей из строчных букв латинского алфавита. Протестируйте ее.
Пример 7. Написать М-функцию с именем tlimit для вычисления пределов от строковых выражений.
Программный код решения примера
function f = tlimit(s, x, p, side) % Функция вычисления пределов % Входные аргументы функции: % s - строковое выражение от одного или нескольких аргументов % х - имя предельной переменной, символьный (sym) % или строковый тип (char) % p - предельное значение переменной, вещественный тип, % например, 0, inf, 1 % side - значение одностороннего предела, например, % 'left', 'right' % Возвращаемое значение: % f = результат вычисления предела, символьный тип f = limit(sym(s), sym(x), p, side);% см. help limit % limit - библиотечная функция % sym - оператор преобразования строковой переменной % к символьному типу (классу) end |
Пример применения функции tlimit по вычислению второго замечательного предела:
>> s = '(1 + 1/x)^x'; f = tlimit(s, 'x', inf, 'left')
f =
Exp(1)
>> format long; e = double(f)
e =
2.718281828459045
Задание 4
1. Видоизмените выражение s, чтобы второй замечательный предел вычислялся при стремлении переменной х к нулю.
2. С помощью функции tlimit вычислите первый замечательный предел.
Рассмотрим примеры по вычислению производных и интегралов с помощью библиотечных функций diff и int.
% Вычисление производных и интегралов % с помощью функций diff() и int() % М-сценарий, М_файл diff_int.m clear, clc disp('======================================') disp(' Вычисление производных') % Объявление символьных переменных syms x a % Определение функции y = f(a,x) disp(' Заданная функция:') y = a*sin(x) % a - параметр % Первая производная от y = f(a,x) disp(' Первая производная от заданной функции:') dy = diff(y,x) % дифференцирование по переменной "х" % Вторая производная от функции "y" по переменной "x" disp(' Вторая производная от заданной функции:') dy2 = diff(y,x,2) disp('======================================') disp(' Вычисление неопределенных интегралов') disp(' Первая заданная подынтегральная функция:') y = a*sin(x) disp(' Значение неопределенного интеграла:'); iY = int(y, x) fprintf(' Результат с постоянной интегрирования C:\n %s + C\n', char(iY)); disp(' Вторая заданная подынтегральная функция:') syms t % объявление символьной переменной y2 = cos(3*t)/((sin(3*t) - 4)^(1/5)) disp(' Вывод функции с помощью pretty'); pretty(y2) disp(' Значение неопределенного интеграла:') iY2 = int(y2) % Введение постоянной интегрирования С p = strcat(char(iY2), ' + C'); p2 = sym(p) disp(' Вывод результата интегрирования с помощью pretty:'); % pretty(iY2); pretty(p2); disp('======================================') disp(' Вычисление определенных интегралов') disp(' Заданная первая подынтегральная функция:') y3 = sin(x) % интегрант, подынтегральная функция disp(' Значение определенного интеграла в пределах от 0 до pi:') iY3 = int(y3, 0, pi) % 0, pi - пределы интегрирования disp(' Заданная вторая подынтегральная функция:') y4 = 1/(x^2 + 4*x + 13) % интегрант, подынтегральная функция disp(' Значение несобственного интеграла в пределах от 1 до +inf:') iY4 = int(y4, 1, inf) % 1, inf (бесконечность)-пределы интеграла disp('======================================') |
Результат выполнения программы:
======================================
Вычисление производных
Заданная функция:
y =
a*sin(x)
Первая производная от заданной функции:
dy =
a*cos(x)
Вторая производная от заданной функции:
dy2 =
-a*sin(x)
======================================