1100.01=1x2^3+1x2^2+0x2^1+0x2^0+0x2

advertisement
zapis dziesiętny:
12.25=1x10^1+2x10^0+2x10^(-1)+5x10^(-2)
zapis binarny:
1100.01=1x2^3+1x2^2+0x2^1+0x2^0+0x2^(-1)+1x2^(-2)
(=12.25)
Tak jak 1/3 nie może być zapisana w skończonym zapisie
dziesiętnym
Tak też 1/5 nie może być zapisana w skończonym zapisie binarnym
0.2=0.0011001100...
Dlatego
1-0.2-0.2-0.2-0.2-0.2=5.5511e-017
1 Polecenia terminala:
pwd print working directory (pokazuje sciezke folderu
roboczego)
cd H:/Octave - change directory to H:/Octave (zmienia folder
roboczy na H:/Octave, jesli taki istnieje)
cd .. cofa sie o jeden stopien w hierarchii folderow (np.
jestem w H:/Octave/zajecia1 a po wpisaniu cd .. bede w
H:/Octave)
cd ~/ - wraca do wyjsciowego folderu roboczego
ls - print directory listing - wyswietla foldery i pliki
znajdujace sie w danym folderze roboczym
mkdir name - make directory - tworzy nowy nowy folder w
folderze roboczym o nazwie name
2 Podstawowe polecenia Octave:
clc - clear the screen - czysci ekran w terminalu
clear all - czysci wszystko: zmienne, etc.
whos - podaje informacje, jakie sa zdefiniowane zmienne
help - wyswietla pomoc
help NAME - wyswietla pomoc dotyczaca komendy NAME
[Ctrl C] - przerywa obliczenia (jesli sa dlugie albo sie cos
zawiesilo)
quit - wychodzi z Octave
format short - fixed point format with 5 digits
format long - fixed point format with 15 digits
ceil (x) - najblizsza liczba calkowita nie mniejsza niz x
floor(x) - najblizsza calkowita nie wieksza niz x
round(x) - najblizsza x liczba calkowita
3 Polecenia macierzowe
3a) Tworzenie macierzy
A = [1, 2; 3, 4] lub A = [1 2; 3 4] podanych skladowych, ';' oznacza nowy
oznacza nowa kolumne
B = [A [5; 7]] - dodawanie kolumny do
C = [A; [5 7]] - dodawanie wiersza do
tworzy macierz 2x2 o
wiersz, ',' lub spacja
macierzy
macierzy
3b) Indeksowanie
aij = A(i,j) - element macierzy wiersz i kolumna j
ri = A(i,:) - i-ty wiersz macierzy A
cj = A(:,j) - j-ta kolumna macierzy A
B = A(i:k, j:l) - podmacierz zlozona z wierszow od i do k
macierzy A oraz z kolumn od j do l macierzy A
A(3,:) = 5 - jesli 3 wiersz nie istnieje to jest dodawany do
macierzy A
A(2,:) = [] - drugi wiersz macierzy A bedzie skasowany
indices = 1:6 - zwraca wektor wierszowy [1, 2, 3, 4, 5, 6]
steps = 13:-3:1 - zwraca wektor wierszowy [13, 10, 7, 4, 1]
x = linspace(0,10,100) - zwraca wektor wierszowy o 100
elementach rowno rozmiezczonych pomiedzy 0 a 10
3c) Rozmiary macierzy
nr = size(A,1) lub nr = rows(A) - zwraca ilosc wierszy macierzy
A
nc = size(A,2) lub nc = columns(A) - zwraca ilosc kolumn
macierzy A
[nr nc] = size(A) - zwraca obie rzeczy naraz w wektorze
wierszowym
l = length(A) - zwraca wieksze z nr i nc
numel(A) - zwraca ilosc elementow A
3d) Operacje na macierzach
C = A*B - mnozenie macierzy (nxk) z macierza (kxm)
D = A.*B - mnozenie element po elemencie macierzy o tych samych
wymiarach (to samo z dodawaniem, potega i dzieleniem)
B = A' - transpozycja macierzy
B = inv(A) - odwracanie macierzy
d = det(A) - determinant macierzy A
A/B lub A*inv(B) - dzielenie z prawej strony macierzy A przez B
B\A lub inv(B)*A - dzielenie z lewej strony macierzy A przez B
[v lambda] = eig(A) - dekompozycja macierzy na macierz
digonalna wartosci wlasnych lambda oraz macierz wektorow
wlasnych v
3e) Operacje wektorowe
s = x'*x - iloczyn scalarny wektora x
sum(v) - liczy sume elementow wektora v
cumsum(v) - liczy kumulatywna sume wektora v, czyli wektor
[v_1; v_1+v_2; v_1+v_2+v_3; ...]
prod(v), cumprod(v) - to samo dla mnozenia
diff(v) - wylicza roznice miedzy kolejnymi elementami wektora
[v_2-v_1;v_3-v_2; ...]
mean(v) - wylicza srednia z elementow wektora
std(v) - wylicza odchylenie standardowe elementow wektora
min(v), max(v) - zwraca element minimalny oraz maksymalny
wektora
sort(v, 'ascend'), sort(v,'descend') - sortuje rosnaco i
malejaco elementy wektora
3f) Macierze specjalne
A = zeros(m,n) - zwraca macierz zer o wymiarach mxn
B = ones(m,n) - zwraca macierz jedynek o wymiarach mxn
I = eye(n) - zwraca macierz jedynkowa o wymiarach nxn
D = diag([a b c]) - zwraca macierz diagonalna, gdzie a, b i c
sa elementami na przekatnej macierzy
R = rand(m,n) - macierz mxn o elementach z rozkladu
jednostajnego miedzy 0 a 1
N = randn(m,n) - macierz mxn o elementach z rozkladu normalnego
o sredniej 0 i warancji 1
v = randperm(n) - wektor wierszowy z losowa permutacja liczb od
1 do n
4) Wykresy
Przykladowy programik zapisany jako name.m
x=linspace(0,1,100);
% Tworzymy 100 rownorozmieszczonych
punktow miedzy 0 a 1
y=x.*cos(x);
% Mnozymy element po elemencie
te punkty przez cosinus tych punktow
z=x.*sin(x);
% To samo dla sinusa
plot(x,y,x,z)
% Wykres obu funkcji na jednym
wykresie
title('Some innocent plottings.')
% Tytul wykresu
xlabel('domain')
ylabel('values')
legend('x*sin(x)','x*cos(x)')
% Podpis pod osia x
% Podpis pod osia y
% Legenda
figure(2)
% Otwiera okienko dla nowego wykresu
subplot(1,2,1)
% Tworzy poziomo obok siebie dwa miejsca
na wykresy i ogniskuje sie w lewym miejscu
plot(x,y)
% Rysuje
subplot(1,2,2)
% Teraz ogniskuje sie na prawym miejscu
plot(x,z)
% Rysuje
figure(3)
plot3(x,y,z)
grid on
5) Wielomiany
% Otwiera okienko dla nastepnego wykresu
% Trojwymiarowy wykres
% wlacza linie siatki
p = conv([1 0 3],[1 1 -3]) - mnozenie dwoch wielomianow
polyval([1 0 .5 -4],3) - wartosc wielomianu dla x=3
roots([1 0 .5 -4]) - szuka pierwiastkow wielomianu
Przykladowy programik zapisany jako name.m
x=linspace(1,50,301); % tworzy wektor wierszowy o 301
elementach rowno rozmieszczonych pomiedzy 0 a 50
y=polyval([1 0 .5 -4],x);
% wartosci wielomianu dla tych 301
punktow
z=2*rand(1,301).*polyval([1 0 .5 4],x);
% kazda z tych
wartosci wielomianu jest w sposob losowy "zaburzana"
curve=polyfit(x,z,3)
% Dopasowujemy MNK do tych
"zaburzonych" wartosci wielomian o stopniu 3
plot(x,z,x,polyval(curve,x),x,y);
% Wykres wyjsciowego,
zaburzonego oraz dopasowanego wielomianu
legend('data','fitted','undistorted') % Legenda
6) Wpisywanie tekstow
fprintf('A Matlab program. \nThe author is anonymous.')
%
Wpisuje jako tekst, \n przechodzi do nowej linii
fprintf('e=%g\npi=%g', exp(1),pi)
% wpisuje tekst i
podstawia pod %g wartosci, ktore sa za apostrofem
tellme=input('Give me a number:');
% Wpisuje tekst w
apostrofie i czeka na odpowiedz
fprintf('The number you gave me is %g.', tellme) % Zwraca
odpowiedz z numerem, ktory zostal podany
7) Petla for
for indeks=ciag albo zbior
instrukcje;
end
Przykladowy programik dla ciagu indeksow (plik nazwa.m)
frpintf('\nThis program calculates n factorial (n!).\n');
%
Wpisuje na poczatku informacje o programie
n=input('Specify n.');
% Program bedzie czekac na
wpisanie wartosci n przez uzytkownika
factorial=1;
% Wartosc poczatkowa
for i=n:-1:2
% n:-1:2
ma zaczac od n
% pozniej cofac sie za kazdym
% razem o jeden az dojdzie do 2
factorial=factorial*i;
% Pomnoz dotychczasowa wartosc
% przez nastepna liczbe
end;
frpintf('\n%g!\n\n', n, factorial); % Na koniec przedstawiany
% jest rezultat
Przykladowy programik dla zbioru indeksow (plik nazwa.m)
% Program liczy sume liczb pierwszych nizszych niz 20
sum=0;
% Wartosc poczatkowa sumy
for i=[2,3,5,7,11,13,17,19]
% [2 3 5 7 11 13 17 19]
zbior indeksow czyli liczb pierwszych <20
sum=sum+i;
% do dotychczasowej wartosci sumy dodaj
% nastepna liczbe
end;
sum
Przykladowy programik z dwoma petlami zagniezdzonymi (plik
nazwa.m)
% Programik uzyskuje macierz 10x10 z kolejnymi liczbami
% od 1 do 100 idac rzedami
matrix=zeros(10,10);
% Poczatkowa macierz zer
for i=1:10
for j=1:10
matrix(i,j)=(i-1)*10+j;
% We wierszu i kolumnie j
% wstaw wartosc (i-1)*10+j
end;
end;
disp(matrix)
% Pokaz macierz koncowa
Przykladowy programik z dwoma petlami z losowa liczba indeksow
(plik nazwa.m)
% Program zwraca macierz o wymiarach x na x,
% gdzie x jest liczba losowa od 1 do 10.
% W macierzy tej elementy sa po prostu kolejnymi liczbami
% calkowitymi od 1 do x*x
x=ceil(10*rand(1,1));
% Liczba losowa od 0 do 10 jest
% zaokraglana w gore do najblizszej
% liczby calkowitej
matrix=zeros(x);
% macierz x na x zlozona z samych zer
sum=0;
for i=1:length(matrix)
% Indeks od jeden do x,
% gdzie x jest losowe
for j=1:length(matrix)
matrix(i,j)=sum+1;
% Element macierzy
sum=matrix(i,j); % Wartosc sumy do nowego kroku petli
end;
end;
disp(matrix)
8) Petla while i petla if
while warunek
instrukcje;
end
if warunek
instrukcje;
elseif warunek
instrukcje;
else
instrukcje;
end
Warunek jest kategoria logiczna tzn. Octave sprawdza, czy jest
to falsz czy prawda, dlatego stosuje sie inne oznaczenia niz w
przypadku definiowania zmiennych (na przyklad porownaj x = y
oraz x == y ponizej):
x == y
x rowna sie y
x ~= y or x != y
x nie rowna sie y
x <= y, x >=y
x nie wieksze od y, x nie mniejsze
od y
(x > 5) & (x<100)
x nalezy do (5,100) ('&' oznacza
'i')
mod(i+1,3) == 0 | mod(i+2,3) == 0
i+1 jest podzielna przez 3
lub i+2 jest podzielna przez 3 ('|' oznacza 'lub')
xor(mod(i,2) == 0, mod(i+1,2) == 0) albo i jest podzielne przez
2 albo i+1 jest podzielne przez 2 ('xor()' oznacza 'lub
rozlaczne')
all(x)
any(x)
prawdziwe, jesli wszystkie elementy x sa niezerowe
prawdziwe, jesli przynajmniej jeden element jest
niezerowy
Przykladowy programik z petla while oraz petla if (plik
nazwa.m)
fprintf('\nTen program znajduje liczbe, ktorej silnia jest
najblizsza liczbie n, ktora podaje uzytkownik');
n=input('\nEnter n.
');
factorial=1;
i=1;
% Poczatkowa wartosc indeksu
while factorial<n
% dopoki silnia<n
i=i+1;
% Wartosc indeksu do nastepnego kroku
factorial=factorial*i;
% Kolejna wartosc
end;
if abs(n-factorial)<=abs(factorial/i-n)
fprintf('The solution is %g.', i);
else
fprintf('The solution is %g.', i-1);
end
Przykladowy programik z petla if i for (plik nazwa.m)
% Program, ktory wypisuje wszystkie liczby calkowite n
% od 1 do 100 takie, ze n jest podzielne przez 4,
% zas n+1 lub n+2 jest podzielne przez 3
licznik=1;
wektor=[];
% Zdefiniowany wektor pusty czyi bez
% okreslonych wymiarow;
for i=1:100
if mod(i,4)==0&(mod(i+1,3)==0|mod(i+2,3)==0)
wektor(licznik)=i;
licznik=licznik+1;
endif
endfor
ret=wektor;
9) Procedura switch
Zamiast pisac wiele razy "if zmienna=pierwsza wartosc", "if
zmienna=druga wartosc", ....etc., jest procedura switch:
zmienna=input('Zadanie odpowiedzi od uzytkownika') albo liczba
losowa
switch zmienna
case pierwsza wartosc
instrukcje;
case druga wartosc
instrukcje;
otherwise
instrukcje;
end
Przykladowy programik z procedura switch
% Program, ktory pyta o dzien tygodnia zaczynajacy sie od T
%(po angielsku)
answer=input('Name a day of the week that starts with
T.\n','s');
switch answer
case
{'tue','Tue','tuesday','Tuesday','thu','Thu','thursday','Thursd
ay'}
fprintf('Yep, that"s one. You sure know your weekdays.');
otherwise
fprintf('Either you misspelled the day you meant, ');
frpintf('or you should take a hard look at your
calendar.');
end
10) Funkcje
Trzeba zapisac plik o nazwie 'nazwafunkcji.m', ktory wyglada
nastepujaco:
% Komentarz w pierwszych linijkach bedzie wyswietlal sie po
% wywolaniu 'help nazwafunkcji'
function [ outputvars ] = nazwafunkcji (arguments)
instrukcje;
y=outputvars
Przykladowa funkcja (plik o nazwie smart_urdmv.m) - przyklad
uzycia petli if
% Funkcja, ktora bierze jako input liczbe wierszy r,
% liczbe kolumn c oraz ropietosc d i zwraca macierz rxc
% o elementach bedacych liczbami losowymi miedzy 0 a d
% Opcjonalnie mozna podac tylko dwa argumenty:
% wymiar wektora c oraz rozpietosc d i wtedy funkcja zwraca
% wektor c-elementowy o elementach bedacych
% liczbami losowymi miedzy 0 a d
function y=smart_urdmv(d,r,c);
if nargin==3
% Jesli liczba argumentow funkcji rowna sie 3
y=rand(r,c); % create the matrix
y=d*y; % adjust the interval and display the matrix
elseif nargin==2 % Jesli liczba argumentow funkcji rowna sie 2
c=r; % reassign input variables
y=rand(1,c); % create the vector
y=d*y;
% adjust and display
else
% Jesli liczba argumentow zgloszonych do funkcji
% nie rowna sie ani 2 ani 3
y=0;
end
Przykladowa funkcja (plik maks.m) - przyklad uzycia petli for i
if
% Funkcja, ktora podaje maksymalny element macierzy
function [ wartosc ] = maks (A)
m=size(A)(1);
n=size(A)(2);
dotychczas=A(1,1);
for i=1:m
for j=1:n
if A(i,j)>dotychczas
dotychczas=A(i,j);
endif
endfor
endfor
wartosc=dotychczas;
endfunction
Przykladowa funkcja (plik onedim.m) - przyklad zagniezdzonych
petli if z nargin
% Funkcja, ktora liczy pochodna z funkcji w punkcie,
% gdzie podac mozna funkcje, punkt, w ktorym ma byc
% liczona pochodna oraz dokladnosc epsilon i informacja czy ma
% byc liczona pochodna centralna czy prawostronna
% 0 oznacza prawostronna a 1 oznacza centralna
% Jesli podanych jest 3 argumentow, przyjmuje sie centralna
% pochodna, jesli podanych jest dwa argumenty
% przyjmnuje sie dokladnosc = 0.0001
function [ ret ] = onedim (funkcja,x0,epsilon,czy_centralna)
if nargin<4
czy_centralna=1;
if nargin<3
epsilon=0.0001;
endif
endif
if czy_centralna
ret=(feval(funkcja,x0+epsilon)-feval(funkcja,x0epsilon))/2/epsilon;
else
ret=(feval(funkcja,x0+epsilon)feval(funkcja,x0))/epsilon;
end;
endfunction
Download