Лекция 5 Основни елементи на програмната среда matlab



Дата14.04.2017
Размер69.41 Kb.




ЛЕКЦИЯ 5 Основни елементи на програмната среда MATLAB

Основните обекти в МATLAB са матрици (MATLAB означава матрична лаборатория MATrix LABoratory). Числата се представят с едномерна матрица (1x1), вектор-ред се представя от матрица с размерност (1xN), а вектор-колонка се представя от матрица (Nx1). Полиномите могат да се представят като вектори-ред, чийто компоненти са коефициентите на полинома.

ВЪВЕЖДАНЕ НА МАТРИЦИ И ОСНОВНИ ОПЕРАЦИИ

Най-важният оператор е квадратните скоби, който дефинира обекта-матрица. Точка и запетая разделят колонките, а елементите на редовете се разделят със запетая, или с интервал. Точка и запетая поставени на края на израз блокират извеждането на резултата от командата на екрана. Променливите не се декларират явно, а тяхната размерност се отчита автоматично при присвояването на стойност. Знакът процент % отделя коментарите, които не се изпълняват от компютъра. Например, можем да въведем следните променливи: x и y са скалари, а и b са вектори, C и D са матрици:

x=3; y=-2;

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

b=[0 3 –4]; % вектор-ред

C=[1 0 1; 0 1 –1; 1 2 0]; D=[1 pi; 0 –1; x sqrt(-1)]; %матрици

Основни математически операции са събиране +, изваждане -, умножение *, степенуване ^, почленно умножение .*, почленно степенуване .^. Специално внимание заслужава матричното деление:

Ляво деление \: x=A\b е решение на матричното уравнение x*b=А

Дясно деление /: x=A/b е решение на уравнението b*x=A

Операторът ‘ извършва операцията “ермитово спрягане”, което извършва транспониране на матрицата и комплексно спрягане на елементите.

Две удобни функции са ones() и zeros(), които създават матрици, чиито елементи са съответно единици или нули. Така например с командите:

M=3; N=5; a=zeros(M,N);създаваме матрица с размерност (3x5) и с елементи нули. Командата B=ones(N);създава матрица с размерност (5x5) с елементи единици.

Ако размерностите на операндите не са съгласувани за съответната операция излиза съобщение за грешка.

Зад.1 След като сте въвели горните променливи изпълнете следните операции:

a*b, a.*a, a.^2, a’, D’, C*ones(3),

В следния пример една матрица може да се разшири както е показано:

A=[1 2 3;4 5 6]; B=[A;[7 8 9]];

Функцията size има за аргумент матрица и връща размерноста и, т.е. броя на редовете и колонките:

[r,c]=size(A);

Основен оператор е двуеточието : и неговото значение е да задава границите на обхват “от : до”. Така например можем да запишем:

B=[1:3; 4:6; 7:9]; вместо В=[1 2 3; 4 5 6;7 8 9];

Използването на оператора двуеточие не само съкръщава кода, но прави и неговото изпълнение по-бързо тъй като се извършват векторни операции вместо операции елемент по елемент. Например следните команди образуват цикъл по индекса i, който копира първата и последна колонка на матрицата В във векторите first и last.

Зад. 2.1 Въведете произволна матрица В и извършете командите:

[M, N]=size(B);

for i=1:M

first(i)=B(i,1);

last(i)=B(i,N);

end


Същото нещо може да се запише по-кратко:

[M, N]=size(B);

first = B(:,1);

last=B(:,N);

Зад. 2.2 Създаване на подматрица. Следната команда извлича първия и третия ред на матрицата В:

C=B([1,3], : );

Забележете, че тук матрицата се използва като функция (след буквата следват скоби) с два аргумента, отделени със запетая. Първият аргумент е вектор с индексите на редовете на матрицата, а втория аргумент е вектор с индексите на колоните.

Друга полезна функция за създаване на вектори е linspace. Така например командата:

x=linspace(0, 10, 8);

създава вектор-ред с размерност (1x8). Първият елемент е 0, последният е 10, с 8 точки между тях, с линейна зависимост. Същото нещо може да се постигне с командата:

y=[0:10/7:10];

Тук се използва конструкцията “от: стъпка:до”. Ако стъпката не е указана, по подразбиране се приема единица.

Зад. 3 Матрица с размерност (5x5), чиито елементи са случайни числа в интервала (0,1) може да се генерира със следната команда: x=rand(5,5); След като сте създали х извлечете подматрица от нечетните индекси по следния начин: y=x(1:2:5,1:2:5);

ЧИСЛА и ГРЕШКИ.

Точноста с която са зададени реалните числа се определя от т.нар. грешка на закръгляване. Тя се означава с eps и се дефинира като най-малкото число така, че 1 и 1+eps/2 да са едно и също число за компютъра. Стойноста на eps се връща след въвеждане на командата eps. Тази стойност зависи от компютъра и обикновено е от порядък 10-16. При физическите числови симулации точността не е необходимо да е повече от 6 знака. При N операции грешката нараства както N1/2 затова могат да се извършат 1020 операции докато се достигне критичната точност от 6 знака. Ако процесора е с честота 1GHz толкова на брой операции се извършват за 100 години. Така че грешката на закръгляване не е проблем освен ако не стане критична. Тя може да стане критична ако например резултатът е разлика между две големи и почти еднакви числа.

Зад.4 Определете eps за вашия компютър. Опитайте следните изчисления:

x=1e-15;

y=((1+x)-1)/x;

Резултатът от компютъра е 1.1102, а трябва да е точно 1. Вижда се че в такива случаи, когато имаме разлика между две големи числа с близки стойности, грешката е много голяма.


ПСЕВДОЧИСЛА


Друг случай на грешка е когато имаме лошо дефинирани аритметични операции като например неопределени изрази или делене на нула. В по-старите програмни езици това може да доведе до прекъсване и излизане от програмата със съответната загуба на информация. MATLAB обаче е защитена от такива опасни операции като връща т. нар. псевдочисла. Нека например искаме да изчислим функцията f(x)=sin(x)/x за x[0,2]. Това може да се реализира с помощта на следния код:

x=linspace(0,2*pi,1024);

y=sin(x)./x;

Сега, ако искаме да видим първия елемент на вектора у набираме командата: y(1).

Отговорът е NaN, което значи Not a Number, “не е число”. Действително в случая делим нула на нула, което е неопределеност. Всяка операция с NaN връща NaN, така че псевдочислата има тенденция да се разпространяват лавинообразно. Друго псевдочисло е Inf, което означаво Infinity т.е. “безкрайност”. Inf се получава при 1/0, докато – Inf се получава при –1/0 или log(0). Операциите Inf/Inf и Inf-Inf връщат стойност NaN, докато Inf+Inf връща Inf.

Неопределеноста в последния пример с функцията f(x)=sin(x)/x може да се избегне като определим отделно особената точка, примерно f(0)=1 т.е.:

y=sin(x)./x;

y(0)=1;


В случая обаче имаме само една особена точка и при това знаем точно къде се намира. Много по-общо и по-ефикасно е следното решение:

y=ones(size(x)); %инициализираме у с единици

k=find(x~=0); % функцията find връща вектор от индекси, за които x не е нула.

y(k)=sin(x(k))./x(k); %избягнато е делене с нула


ВХОД, ИЗХОД и ГРАФИКА


Входната команда input подканя да се въведе стойност, която се приема от клавиатурата. Например: x=input(‘Enter value of x:’);

В случая може да се въведе скалар, матрица или произволен израз.

Командата disp извежда на екрана стойноста на променлива или текстов израз string. Например:

M=[1:3;4:6;7:9];

disp(‘the value of M is:’);

disp(M);

Командата за построяване на графика на вектора y като функция на вектора x е следната: plot(x,y);

Зад. 5: Постройте графиката на функцията: f(x)=exp(-x/4)*sin(x), където x се изменя от 0 до 20. Извършвайте аритметичните операции елемент по елемент.


ФУНКЦИИ


Функциите имат важно значение за физиката тъй като описват връзките между величини, които могат да се измерят. Ще разгледаме един пример изразяващ известната формула на Планк за спектралното разпределение на излъчването на абсолютно черно тяло:

К
ъдето x=hw/kT e безразмерна величина.

В MATLAB често е удобно функциите да се дефинират в отделни

m-файлове като името на файла и на функцията съвпадат. Ще реализираме функция planck като отворим в менюто нов m-файл и записваме следния код:

%this file is planck.m

function s=planck(x); %обявяваме функцията и нейното име

%по-долу следва дефиниция на функцията

s=zeros(size(x));%инициализираме вектора s с нули

k=find(x~=0);%определяме тези индекси к, за които вектора х не е нула

s(k)=15/pi^4*x(k).^3./(exp(x(k))-1);%дефинираме функционалната зависимост



Зад. 6.1 Наберете функцията planck и я запишете във вашата работна директория като m-файл с името на функцията т.е. planck.m. Изведете графично функцията като използвате командите:

x=linspace(0,10,240);

plot(x, planck(x));

Тъй като формулата на Планк е функция на разпределение на вероятност интегралът от 0 до безкрайност трябва да е 1.



Зад. 6.2 Итегрирайте от 0 до 20 като използваме функцията quad, която дава квадратурата т.е. интеграла на функцията в указаните граници:

quad(‘planck’,0,20)

Зад. 6.3 Определете най-вероятната честота на излъчване като намерите максимума на кривата. В библиотеката на MATLAB разполагаме с функция fminbnd за откриване на минимума на дадена функция в определен интервал. За да я използваме първо трябва да обърнем знака на формулата на Планк, при което максимума се превръща в минимум, както следва:

np=inline(‘-planck(x)’);

xmax=fminbnd(np,0,20);

Отговорът е 2.8214.



Зад. 6.4 Опредете енергията под и над спектралния максимум както следва:

elo=quad(‘planck’,0,xmax);



ehi=quad(‘planck’,xmax,20);

Проверете дали сумата от двете числа е 1.


База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница