Файл: М.А. Тынкевич Система Matlab Справочное пособие к курсу Численные методы анализа.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 01.06.2024
Просмотров: 116
Скачиваний: 0
|
10 |
|
if <условие> |
if <условие> |
if <условие> |
<команды> |
<команды> |
<команды> |
end |
else |
elseif <условие> |
|
<команды> |
<команды> |
|
end |
else |
|
|
<команды> |
|
|
end |
В роли условия может использоваться любое логическое выражение, построенное на основе операций отношения и логических. Если значение этого выражения является массивом, то условие считается истинным, если все его элементы истинны (истина – 1, ложь – 0).
Оператор цикла с заданным числом повторений, в основном
используемый в форме: |
|
for V=A :H:B |
for V=A:B |
<команды> |
<команды> |
end |
end |
(V –переменная/параметр цикла, A,B – начальное и конечные значе- |
|
ния; H – приращение, по умолчанию 1). Допускаются и вложенные |
|
циклы, например: |
|
for i=1:n |
for i=1:n-1 |
for j=1:m |
for k=i+1:n |
a(i,j)=x(i)^j; |
if a(i)<a(k) |
end |
m=a(i) |
end |
a(i)=a(k) |
|
a(k)=m |
end end
end
Взаголовке цикла можно использовать одномерный массив. Так цикл k=1;
for i=[0 5 7] x(k)=2^i; k=k+1;
end
формирует массив Х=[1 32 128].
Оператор цикла с предусловием имеет традиционную конст-
рукцию:
while <условие> <команды>
end
и обеспечивает выполнение команд тела цикла, пока истинно проверяемое условие. Заметим, что работа цикла может быть прервана (вы-
11
ход из внутреннего цикла) оператором break: while a<1
n=n+1
if n>250 break
end ...
Оператор переключения обобщает условный оператор на случай более двух условий и имеет конструкцию:
switch <выражение> case <значение 1>
<команды> case <значение 2> <команды>
. . . . .
otherwise |
% может отсутствовать |
<команды> |
|
end
Контрольные значения проверяются на равенство и могут задаваться и списком:
swith k case 0
t=1 case (1, 2,5)
t=2 otherwise t=0
end
Выход из функции в вызывающую программу обеспечивается выполнением последнего ее оператора или командой return.
Кроме упомянутых основных операторов, традиционных для любой системы программирования, остановимся на ряде операторов обеспечения пользовательского интерфейса.
Ввод с клавиатуры реализуется командой вида <переменная>= input (‘подсказка’)
Например,
» x=input(' степень полинома '); степень полинома 3
Приостановка выполнения программы может быть преду-
смотрена включением в текст команды pause (приостановка до нажатия любой клавиши), pause (n) (приостановка на n сек), keyboard (приостановка с возможностью выполнять практически любые команды и последующим возвратом в программу командой return).
12
Можно построить выбор варианта с клавиатуры созданием ме-
ню:
<переменная>=menu(‘заголовок’,’выбор1’,’выбор2’,...) Например, команда:
k=menu(‘Использовать метод’,’Гаусса’,’Краута’,’простой итерации’) создаст на экране всплывающее меню с указанными пунктамиклавишами и щелчок по клавише задаст значение переменной k, равное 1, 2 или 3.
Мы не останавливаемся на многообразии операторов, связанных с выводом на экран (вывод значения disp, форматированный вывод fprint), отладкой и сигнализацией об ошибках, анализом списка аргументов и др.
Приведем несколько простейших примеров использования программного режима.
Пример 1. Анализ скорости убывания элементов числовой последовательности
yn = ( −1 )n+1 nn .
до значений, меньших 0.0001)
Чтобы с легкостью отыскивать значения элементов последовательности, опишем функцию (файл y.m):
function f=y(n)
if mod(n,2)==0 f=-1;
else
f=1;
end f=f/n^n;
end
и сценарий (файл limit1.m): n=1 ;
while abs(y(n))>1e-4 n=n+1 ;
end
disp('Число элементов последовательности равно') k=n
for x=1:k Y(x)=y(x);
end
disp('Значения элементов последовательности') Y
plot(1:k,Y, 'r-*' ) %Линия -сплошная(-)красная ®, маркеры(*)
1 |
|
|
|
|
|
|
|
|
|
|
0.8 |
|
|
|
|
|
|
|
|
|
|
0.6 |
|
|
|
|
|
|
|
|
|
|
0.4 |
|
|
|
|
|
|
|
|
|
|
0.2 |
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
-0.2 |
|
|
|
|
|
|
|
|
|
|
-0.4 |
1.5 |
2 |
2.5 |
3 |
3.5 |
4 |
4.5 |
5 |
5.5 |
6 |
1 |
13
Теперь можно в командной строке набрать вызов limit1, получая на экране число элементов последовательности k, значения элементов последовательности Y (n=1÷k) и “график” функции:
Число элементов последовательности равно k =6
Значения элементов последовательности
Y = 1.0000 -0.2500 0.0370 -0.0039 0.0003 -0.0000
Пример 2. Поиск оценки суммы ряда.
∞ |
1 |
|
∑( −1 )m−1 |
||
( 2m−1 ) ( 2m−1 )! |
||
m=1 |
||
|
с точностью 10-6.
Файл limit2.m (сценарий): y=1;
s=y ; m=1;
while abs(y)>1e-6 y=-y*(2*m-1)/(2*m+1).^2; s=s+y;
m=m+1 ;
end
disp('Число слагаемых' ) disp( m-1)
disp('Оценка суммы') disp(s)
В командной строке набираем limit2 , получая на экране число элементов отрезка суммы, превышающих 10-6 и саму оценку суммы:
Число слагаемых |
6 |
Оценка суммы |
0.90097107966794 |
4. Операции над массивами
Формирование массива, как было показано выше, осуществляется прямым (построчным) перечислением его элементов подобно А=[1 3 5 7; 4 5 6 7] (2 строки и 4 столбца), В=[1; 3; 5; 7] (столбец с 4
элементами) или заданием диапазона значений с заданным (или умал-
14
чиваемым единичным) шагом [1:2:7], [4:7], [ [1:2:7]; [4:7] ] и т.п.
Доступ к элементам или блокам элементов массива производится указанием индексов или массива индексов:
A(2,k) – элемент второй строки и k-го столбца; A(:,k) - k-й столбец;
A(1:3; 1:4) – подматрица из первых 3 строк и 4 столбцов матри-
цы;
C(:, :, 12) –12-я страница трехмерного массива.
Следует учесть, что хранение массивов в памяти ведется по столбцам. Поэтому возможна работа с созданным многомерным массивом как с одномерным, например, A(:) – вектор-столбец из всех элементов массива А, A(13:17) – столбец из элементов с номерами от 13 до 17.
Имеется возможность объединять массивы “по горизонтали”- [A, B, C] или [A B C] (массивы с одинаковым числом строк) и “по вертикали” -[A; B;C] (массивы с одинаковым числом столбцов).
Из вектора можно удалить одинаковые элементы функцией unique(X). Существует возможность объединения множеств - union(X,Y), пересечения - intersect(X,Y), разности – setdiff(X,Y):
» a=[1 2 3 6]; |
» union(a,b) |
|
|
»intersect(a,b) |
» setdiff(a,b) |
||||
» b=[1 3 7]; |
ans = |
|
|
|
ans = |
|
ans = |
|
|
|
1 |
2 |
3 |
6 |
7 |
1 |
3 |
2 |
6 |
Функция find дает поиск по условию элементов одноили двухмерного массива в формате команд k=find(X<условие>), [i,j]=find(A<условие>) (если условия нет, отыскиваются ненулевые элементы):
» X=[ 1 0 -3 6 7 13] |
» k=find(X==0 | X<0) |
|
»[i,j]=find(A>0& A<5) |
|||||
X = |
|
|
|
|
k = |
|
|
i = 1 |
1 0 |
-3 |
6 |
7 |
13 |
2 |
3 |
|
2 |
» A=[1 4 7 ; 2 0 -2] |
|
|
|
1 |
||||
A = |
|
|
|
|
» k=find(X) |
|
j = 1 |
|
1 |
4 |
7 |
|
|
k = |
|
|
1 |
2 |
0 |
-2 |
|
|
1 |
3 4 5 6 |
|
2 |
|
Для определение длины вектора используется функция length : |
|||||||
» k=length('Это строка') |
» X=[ 1 0 -3 6 7 13]; |
» k=length([1 4 7 ; 2 0 -2]) |
||||||
k = |
10 |
|
|
|
» k=length(X) |
k = 3 |
||
|
|
|
|
|
k = |
6 |
|
|
и для размеров массива – функцию size : |
|
|
||||||
» X =[ 1 0 –3 ; |
6 |
7 13] |
» [m, n]=size(X) |
|
» size([2 4 7]) |
|||
» k=size(X) |
|
|
m = |
1 |
|
ans = 1 3 |
||
k = |
2 |
3 |
|
|
n = |
6 |
|
|
15
Суммирование и умножение элементов массива можно реа-
лизовать функциями sum(A) и prod(A) (для двумерного массива выполняется поиск сумм и произведений по столбцам). С помощью функций sum(A,dim) и prod(A,dim) можно выполнить операции по измерению dim. Функцию sum часто используют для поиска скаляр-
ного произведения векторов ( A B ) = ∑n |
Ai Bi |
в форме sum(A.*B): |
||||
|
|
|
i =1 |
|
|
|
» a=[ 1 2 3; 4 7 -1]; |
» t=sum(a) |
» p=prod(a) |
|
» a=[ 1 2 3]; |
||
» sum(a,2) |
t = |
5 9 2 |
p = 4 14 |
-3 |
» b=[ 3 5 7]; |
|
ans = 6 |
» tt=sum(t) |
» p=prod([1:5]) |
» sum(a.*b) |
|||
10 |
tt = |
16 |
p = 120 |
|
ans = 34 |
Сортировку элементов массива по возрастанию можно вы-
полнить функцией sort(A,dim) , причем команда [B,I]= sort(A) выдает и список индексов. Сортировку по убыванию можно выполнить аналогичной функцией sortrows.
Среди других следует отметить и ряд функций комбинаторики: perms(V) –перестановки всех элементов вектора V размерности
n (массив размерности n!×n) : |
|
|
|
|
|
|
|
|
|
|
||||
» perms (3:2:7) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ans =[ 7 5 |
3; |
5 |
7 |
3; |
7 |
3 |
5; |
3 |
7 |
5; 5 |
3 |
7; 3 |
5 |
7] |
» perms([3 2 7]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ans =[ 7 2 |
3; |
2 |
7 |
3; |
7 |
3 |
2; |
3 |
7 |
2; 2 |
3 |
7; 3 |
2 |
7] ; |
nchoosek (n,k) – число сочетаний из n по k =n!/ (k! (n-k)!): |
|
» nchoosek(7,2) ans = 21;
nchoosek (V,k) – массив всех сочетаний элементов вектора V: » nchoosek([3 2 7],2) ans = [ 3 2; 3 7; 2 7 ];
Иногда могут быть полезными функции начального задания: zeros(n), zeros(m,n), zeros(size(А)) – формирование массива ну-
лей (одномерного, двумерного, соразмерного с массивом А); допустимо формирование массива и большей размерности zeros(m,n,p,...) ; ones(n), ones(m,n), ones(size(А)) - формирование массива еди-
ниц ;
rand(n), rand(m,n), rand(size(А)) - формирование массива чисел с равномерным законом распределения в (0,1);
randn(n), randn(m,n), randn(size(А)) -формирование массива чисел с нормальным законом распределения (Mx=0, Dx=1);
eye(n), eye(m,n), eye(size(A)) - формирование единичной матри-
цы (n×n, m×n, соразмерной с матрицей А): |
|
|||
» eye(2,3) |
|
|
» eye(2) |
|
ans = 1 |
0 |
0 |
ans = 1 |
0 |
0 |
1 |
0 |
0 |
1 |