Файл: М.А. Тынкевич Система Matlab Справочное пособие к курсу Численные методы анализа.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.06.2024

Просмотров: 98

Скачиваний: 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 )m1

( 2m1 ) ( 2m1 )!

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