Основы программирования в MATLAB
Оператор цикла for
for count = start:step:final
команды MatLab
end
Здесь count – переменная цикла; start – её начальное значение; final – конечное значение; step – шаг на который увеличивается (или уменьшатся) переменная count. Если шаг равен 1, то его можно не указывать.
Например, создадим матрицу Q, размера , элементы которой вычисляются по формуле: , для этого в М-файле hil создадим цикл:
------------------------------------------------------------------------------------------------------------------------
% Задание размера матрицы Q
n = 4;
% Инициализируем матрицу Q и заполняем её нулями
Q = zeros(n);
% Вычисляем элементы матрицы Q
for i = 1:n
for j = 1:n
Q(i, j) = 1/(i + j - 1);
end
end
% Отображаем матрицу на экране
disp('Матрица Q = ')
disp(Q)
------------------------------------------------------------------------------------------------------------------------
Оператор цикла while
while условие цикла
команды MatLab
end
В условии цикла используются операции отношения или логические операторы:
Обозначение | Операции отношения |
= = | равенство |
< (>) | Меньше (больше) |
< = (> =) | Меньше или рано (больше или равно) |
~ = | Не равно |
Логические операторы | Условие | Запись в MatLab | Эквивалентная запись |
Логическое «и» | and (x<3, k = = 4) | (x<3) & (k = = 4) | |
Логическое «или» | or (x = = 1, x = = 2) | (x = = 1) | (x = = 2) | |
Логическое «нет» | not (x = =2) | ~ (x = = 2) |
Найдем сумму диагональных элементов матрицы Q. Набираем команды внимательно, чтобы не произошло зацикливание программы. В случае зацикливания надо принудительно прервать выполнение M-файла. Для этого следует нажать клавиши Ctrl+C или Ctrl+Break.
Продолжаем М-файл hil.
------------------------------------------------------------------------------------------------------------------------
s = 0;
k = 1;
while k <= n
s = s + Q(k, k);
k = k+1;
end
% Отображаем сумму на экране
disp('Сумма диагональных элементов матрицы Q = ')
disp(s);
-----------------------------------------------------------------------------------------------------------------------
У цикла while нет переменной цикла, в отличие, от цикла for, поэтому пришлось до начала цикла присвоить переменной k значение нуль, а затем увеличивать k на единицу.
Оператор ветвления if
Оператор if может применяться в простом виде
if условие
команды MatLab
end
Например, напишем файл-функцию Rfun для вычисления выражения
проверяющую значение аргумента.
------------------------------------------------------------------------------------------------------------------------
function f = Rfun(x);
if abs(x) < 1
warning ('результат комплексный')
end
f = sqrt(x^2-1);
-----------------------------------------------------------------------------------------------------------------------
Команда warning служит для вывода предупреждения в командное окно.
Теперь вызов Rfun от аргумента, меньшего единицы по модулю, приведет к выводу в командное окно предупреждения:
>> y = Rfun(0.2)
Warning: результат комплексный
y =
0 + 0.9798i
В общем виде оператор ветвления представляет конструкцию
if - elseif – else
Напишем файл-функцию ifdem, демонстрирующую работу if - elseif – else.
-----------------------------------------------------------------------------------------------------------------------
function ifdem(a);
if (a == 0)
disp('a равно нулю')
elseif a == 1
disp('a равно 1')
elseif a == 2
disp('a равно 2')
elseif a >= 3
disp('a больше или равно 3')
else
disp('a меньше 3, но не равно 0, 1, 2')
end
----------------------------------------------------------------------------------------------------------------------
В зависимости от выполнения того или иного условия работает соответствующая ветвь программы, если все условия неверны, то выполняются команды, размещенные после else.
Вызовем функцию ifdem с аргументом 1.2:
>> ifdem(1.2)
a меньше 3, но не равно 0, 1, 2
При организации циклических вычислений следует, позаботься о том, чтобы внутри цикла не возникало ошибок, и не было зацикливания программы. Для досрочного прерывания цикла можно использовать команду break. Оператор break прерывает цикл и происходит выполнение операторов, расположенных в строках следующих за последним end.
Например, напишем программу prch, определяющую является ли заданное число N простым.
------------------------------------------------------------------------------------------------------------------------
N = input('Ведите число: ')
или
function prch(N);
% Предполагаем, что число простое (pr=1)
pr = 1;
% Перебираем все возможные делители числа N от 2 до N/2
for i=2:N/2
% Если N делится на i,
if mod(N,i) == 0
% то число N не является простым (pr=0)
pr =0;
% и прерывается выполнение цикла
break;
end
end
% Если pr равно 1, то N - простое число
if pr == 1
disp('ПРОСТОЕ ЧИСЛО')
else
disp('НЕ ЯВЛЯЕТСЯ ПРОСТЫМ ЧИСЛОМ')
end
------------------------------------------------------------------------------------------------------------------------
Прервать не только цикл, но и программу можно также оператором error.
Например, изменим начало программы prch.
------------------------------------------------------------------------------------------------------------------------
N = input('Ведите число: ')
ost = round(N)- N;
if (N > 0) & (ost == 0)
% Предполагаем, что натуральное число простое (pr=1)
pr = 1;
else
error('ЧИСЛО N НЕ ЯВЛЯЕТСЯ НАТУРАЛЬНЫМ')
end
% Перебираем все возможные делители числа N от 2 до N/2
........
------------------------------------------------------------------------------------------------------------------------
Теперь, если ввести число, не являющимся натуральным, то программа прервется и укажет об ошибке ввода.
4. Оператор альтернативного выбора switch
Одним из способов организации разветвлений является оператор switch, имеющий следующую структуру
switch параметр
case значение1
операторы 1
case значение2
операторы 2
case значение3
операторы 3
....
otherwise
операторы
end
Если значение параметра равно значению 1, то выполняются операторы 1, иначе, если параметр равен 2, то выполняются операторы 2 и т.д. Если значение параметра не совпадает ни с одним из значений в группах case, то выполняются операторы, которые идут после слова otherwise.
Например, выведем на экран название дня недели, соответствующее заданному числу D, при условии что в месяце 31 день и 1-ое число – понедельник.
------------------------------------------------------------------------------------------------------------------------
D = input('ВВЕСТИ ЧИСЛО ОТ 1 ДО 31: ')
или
function day_week(D)
md = mod(D,7); %ВЫЧИСЛЕНИЕ ОСТАТКА ОТ ДЕЛЕНИЯ D НА 7
switch md
case 1
disp('ПОНЕДЕЛЬНИК')
case 2
disp('ВТОРНИК')
case 3
disp('СРЕДА')
case 4
disp('ЧЕТВЕРГ')
case 5
disp('ПЯТНИЦА')
case 6
disp('СУББОТА')
otherwise
disp('ВОСКРЕСЕНЬЕ')
end
------------------------------------------------------------------------------------------------------------------------
Функции от функций
MatLab предоставляет возможность написания файл-функции, входными аргументами которых, наряду с обычными переменными, являются и другие файл-функции. При этом имя файл-функции передается в строковой переменной, а её вычисления производиться при помощи команды feval.
Например, напишем файл-функцию, которая проверяет попадает ли значение функции в точке в заданный интервал .
------------------------------------------------------------------------------------------------------------------------
function str = znach (’fname’, ymin, ymax, x)
% проверка входных аргументов
if ymin >= ymax
error('нижняя граница должна быть меньше верхней')
end
y = feval(fname, x)
if (y >= ymin) & (y <= ymax)
str = 'значение функции попадает в заданный интервал';
else
str = 'значение функции не попадает в заданный интервал';
end
------------------------------------------------------------------------------------------------------------------------
Замечание. В этой программе str – строковая переменная и её значения набирают в апострофах.
В качестве исследуемой функции может выступать как встроенная функция MatLab, так и функция с одним входным аргументом, созданная пользователем.
Например, наберем в командной строке последовательность операторов:
>> r = znach('sin', 0.2, 0.5, pi/5)
y =
0.58779
значение функции не попадает в заданный интервал
Способы ввода данных и вывода результатов
Ввод данных:
1. Исходные данные можно задавать с помощью оператора присваивания.
------------------------------------------------------------------------------------------------------------------------
% Исходные данные:
a = -2.5;
b = 1.32;
Fi = 3.89e-3;
A = [1.2 3.2 4.5; 2.3 7.8 4.4];
.
.
.
-----------------------------------------------------------------------------------------------------------------------
2. Интерактивный ввод осуществляется с помощью команды input – запрос на ввод с клавиатуры. Если в M-файле набрать команду
------------------------------------------------------------------------------------------------------------------------
a = input('Ведите значение a = ')
% ввод значения с клавиатуры и занесение введенного значения в а
.
.
------------------------------------------------------------------------------------------------------------------------
то, в командном окне появится надпись
Ведите значение a = |
далее следует ожидание ввода пользователем значения a.
Вывод результатов.
1. Вывод на экран можно осуществить с помощью команды disp.
------------------------------------------------------------------------------------------------------------------------
.
.
.
disp(' Решение x = ')
disp(x)
------------------------------------------------------------------------------------------------------------------------
Результат на экране будет выведен в том формате, который был выбран заранее или по умолчанию.
2. Функция fprintf позволяет управлять видом записи чисел. Схема использования fprintf для вывода на экран при работе с числовыми переменными такова:
fprintf('формат', список переменных).
Например, требуется записать значения переменных и в формате с плавающей точкой, оставляя четыре цифры после десятичной точки для и шесть цифр – для :
------------------------------------------------------------------------------------------------------------------------
x = pi/4;
y = sin(x);
fprintf('x = %7.4f, y = %11.8f\n', x, y)
------------------------------------------------------------------------------------------------------------------------
В результате, в командном окне увидим
x = 0.7854, y = 0.70710678
>>
Последовательность %7.4f задает формат вывода переменной x, которая расположена первой в последовательности вывода. Знак процента указывает на начало формата, цифра 7 обозначает, что всего под значение переменной x отводится 7 позиций (включая знак и десятичную точку), цифра 4 после разделителя-точки обеспечивает точность отображения результата ─ четыре цифры после десятичной точки. Спецификатор f указывает на то, что следует вывести число в формате с плавающей точкой. Аналогичным образом работает формат %11.8f для вывода y.
Для вывода целого числа используется формат %d.
Завершение строки с форматами символом \n приводит к последующему выводу данных с новой строки.
Формат fprintf работает с матрицей по столбцам. Например, напечатаем таблицу значений функции sin(x).
------------------------------------------------------------------------------------------------------------------------
clear all
clc
%Печать заголовка таблицы
fprintf(' ТАБЛИЦА ЗНАЧЕНИЙ ФУНКЦИИ sin(x)\n')
fprintf(' -----------------------------\n')
fprintf(' | x | y |\n')
fprintf(' -----------------------------\n')
%создание вектора значений аргумента
x = 0:pi/4:2*pi;
%конструирование матрицы, первая строка которой содержит значение аргумента
%вторая - значение функции
M = [x; sin(x)];
fprintf(' | %8.5f | %8.5f |\n', M)
fprintf(' -----------------------------\n')
------------------------------------------------------------------------------------------------------------------------