FORUM INSOMNIA
zabawa imprezy problemy przemyślenia seks

∑ temat został odczytany 29436 razy ¬
 
ROZRYWKA | Nauki Ścisłe
MatLab - kurs 
Temat zamknięty [powiadom znajomego]    
Autor "MatLab - kurs"   
 
INSOMNIA
 Wysłana - 4 lipiec 2009 14:34        | zgłoś naruszenie regulaminu

Sprawdź ile procent masz tłuszczu

Zaczynamy,

temat do dyskusji jest tutaj:
[http://www.insomnia.pl/-t614732.html]
ten bedzie zamkniety zeby panowal tu lad. Wszystkie pytania, korekty itp. pisac w tym 2gim temacie. I uwaga... ja specjalista nie jestem wiec sie nie zdziwic jak cos nie tak nazwe typu w workspace przechowywane sa zmienne, a to sie okaze, ze tez cos innego + nie nazywa sie to zmiennymi. Pisze tak jak mi latwiej i mysle, ze latwiej bedzie zrozumiec. Nie mam tez ulozonego planu pisania wiec jesli gdzies po obliczeniach znajdzie sie kawalek o obsludze typu string to sie nie zdziwic. Nie bede opisywal najlepszych sposobow, bo:
1.pewnie sam ich nie znam
2.jeśli już znam to nie chce wykladac wszystkiego dokladnie - sami tez cos musicie zrobic ;)
Aha, i pewnie beda jakies bledy ortograficzne + jezykowe, ale jesli komus to przeszkadza to mozna zrobic kurs matlaba w humanistycznych

_________________________________________________________

I
Pierwsza czesc skierowana jest do ludzi, którzy z MatLabem mają tyle wspolnego co ja z prawem jazdy. Będzie to tzw. wstęp do wstepu.
Mam wersje 6.5 na licencji PWr i pod tą bede pisał. Nie wiem jakie są zmiany w stosunku do poprzednich wersji i co sie zmienilo w pozniejszych wiec nie moge dac gwarancji, ze wszystko co bedzie u mnie dzialalo bedzie dzialalo tez i u Was.
Po zainstalowaniu legalnego MatLaba (oczywiscie piractwem sie brzydzimy) zobaczymy mniej wiecej cos takiego:




jesli jest lekko rózne to view --> zaznaczyc command window i workspace (ja wiecej okien nie potrzebuje, ale komus moga sie przydac).
oznaczone numerem:
1 - workspace: tutaj sa przechowywane zmienne. Jak sie je wpisuje to za chwile.
2 - command window: tutaj wpisujemy polecenia, które chcemy wykonac.









Jesli bede zaczynal od dwóch "sierzantów" (>>) to znaczy, ze mamy otwartego MatLaba, jestesmy gotowi do wpisania polecenia w command window. Oczywiscie po wpisaniu nalezy nacisnac "enter"
>> x = 2
znaczy, ze wlasnie podstawilismy do zmiennej x wartosc 2. Pe lewej w workspace widzimy efekt i opis tego co to jest. Mozemy sobie kliknac dwa razy na linijke z tą zmienną i uruchomi sie nam edytor tablicy. O tym troche pozniej.
>> x = 3
zastapilismy stara wartosc zmiennej x przez nowa, która teraz wynosi 3.
>> x = 4;
to samo co wyzej tylko jak zauwazyliscie nie wypisuje nam juz tego. Zapamietac: przydatne przy tworzeniu tablic zeby nie wypisalo nam na ekran nieczytelnej tablicy 100 x100 i przy pisaniu m-plikow.
Warto zauwazyc, ze operacja
>> 4 = x
zakonczy się bledem

W następnych sekcjach zdarzy mi się cos wpisywac na wzorach ogolnych. Oczywiscie jeśli przeklepiecie to tak jak jest, MatLab wywali bład. Jeśli mielibysmy w workspace zapisane jakieś zmienne np. a i b z odpowiadajacymi wartosciami to wtedy będzie ok. Po prostu jak napisze a + b to trzeba podstawic jakieś dowolne liczby zeby wykonalo dzialanie/operacje.

Dzialania są intuicyjne:
>>x = a + b
do zmiennej x wpisze sume liczb a i b
>> x = a - b
to samo tylko roznice
>> x = a*b
to samo tylko iloczyn
>> x = a/b
a podzielone przez b
>> x = a\b
b podzielone przez a (tak się skalada, ze nigdy tego nie uzywam)
>>x = a^b
wpisze wartosc dzialania: a podniesione do potęgi b
Kolejnosc wykonywania dzialan jest dokladnie taka jak poznalismy w szkole podstawowej dlatego pamietanie o nawiasach to rzecz bardzo wazna.
>> x = 2^3 + 1
wpisze do zmiennej x wartosc dzialania 2^3 (co da 8) + 1 ... 8+1 = 9
>> x = 2^(3+1)
wpisze do zmiennej x wartosc dzialania 2^(3+1) czyli 2^4 co da 16.

Wazne: nazwa zmiennej nie może się zaczynac od cyfry!
>> 2x = 4
wywali bład zreszta jak i to:
>> 2*x = 4

Wazne: jeśli chcemy zapisac np. dwa i poł
>> x = 2,5
wywali bład, poprawna forma to:
>> x = 2.5
zapamietac: u nas pisze się przecinek jako oddzielenie czesci calkowitej od dziesietnej, a w stanach kropke. Dlatego w MatLabie tez mamy kropke. Na początku może być ciezko się przyzwyczaic, ale damy rade.


WEKTORY
czyli to co najwazniejsze w MatLabie. Co to są wektory to chyba kazdy wie. Zapisywalo się to w szkole tak:
v = (v1, v2, ..., vn)
n wymiarowy wektor o wspolrzednych v1, v2, ... , vn
Jednak tutaj zapisywac bedziemy troche inaczej:
v = [v1 v2 v3 v4]
jest to 4-wymiarowy wektor (wiersz) o wartosciach
Jak stworzyc taki podstawowy wektor?
>> x = [1 3 4 5 7]
i już mamy 5cio wymiarowy wektor :). Proste, nie?
Jeśli chcemy stworzyc taki sam wektor tylko kolumne to wygla to tak:
>> x = [1; 3; 4; 5; 7]
Teraz przydaloby się dostac do odpowiednich wartosci. Jest to rownie proste:
>> x(1)
poda nam wartosc pierwszego elementu. Zapamietac: numerowanie zaczynamy od 1, nie ma takiego elementu jak x(0)!
Analogicznie dla pozostalych wartosci. Przy probie wyswietlenie 6tego elementu dla tego wektora wywali blad - nie ma takiego elementu.
Poznajmy teraz pierwszą wbudowana funkcje
>> x = linspace(a,b,c)
jeśli c jest większe lub równe 2 generuje wektor jednakowo odleglych c punktów od a do b (wlacznie)
Najlepiej wpisac kilka wartosci i zobaczyc co się dostanie np.
>> v = linspace(1,3,5)
v =

1.0000 1.5000 2.0000 2.5000 3.0000

v(1) = 1
v(5) = 3
i dzielimy tak ten przedzial zeby razem z jego koncami bylo 5 rownoodleglych pkt.
Sprawdźcie co się dzieje jak c < 2

MatLab ma bardzo dobrze zbudowanego help'a. Wystarczy wpisac:
>> help linspace
i wyswietli się informacja o tej funkcji (można oczywiscie wpisac inne funkcje, których jeszcze teraz nie znamy ;) )

Dość podobny efekt można uzyskać przez komende:
>> x = 0:0.01:1
stwórz wektor zaczynajacy się od 0 ... następna wartosc = 0.01 ... następna = 0.01 + 0.01 ... czyli następna = poprzednia + 0.01.
Zreszta wypisze Wam to na ekran i widac od razu co robi.
Sprawdzic co się dzieje jak się poda cos takiego:
>> x = 0:0.3:1
jak będzie wygladal wektor, jaki będzie element ostatni?

Sprawdzanie długosci wektora.
Wbrew pozorom jest to bardzo wazne i często się z tego korzysta
>> length(x)
poda wartosc dlugosci (zwróćcie uwage, ze nie kazalem tego wpisywac do zmiennej - po prostu wyrzuci to na ekran)
Operacja:
>>x = 0:0.2:1
da nam wektor x = [0 0.2 0.4 0.6 0.8 1]
>> length(x)
poda nam wynik 6

Teraz wpiszmy cos do którejs wartosci wektora
>> x(1) = x(3) + x(4) - x(2+1)
do wartosci 1szej wpisz wynik dzialania: to co kryje się pod 3cia wartoscia + to co kryje się pod 4tą wartoscia - to co kryje się pod 3cia wartoscia (tak, na indeksach tez można dzialani wykonywac i bedziemy robic to często i gesto - wazne zeby uwazac na zakres, który już wiemy jaki jest: 1:length(x) )
Transponowanie wektora. Co to jest chyba kazdy wie - z wektora kolumnowego zrobi wektor rzedowy i odwrotnie. Wykonuje się to tak:
>>y = x'
(to jest apostrof) wlasnie zapisalismy do zmiennej y transpozycje wektora x.
O ile caly czas jestesmy w wektorach, o tyle nie zmieni się nic w indeksowaniu - y(1) dalej będzie pierwszym elementem i będzie się rownał tyle co x(1).

Teraz przyszla kolej na przemnozenie wektorów przez siebie. Jak wiadomo mam 2 opcje: mnozenie skalarne i mnozenie wektorowe (wektorowe tylko jeśli mamy wektory 3 wymiarowe ... a w obu wypadkach muszą mieć taka sama dlugosc!).
>> a = [0 1 2]
>> b = [2 3 4]
Zróbmy na poczatek tak:
>> a * b
i co się okazuje? Bład? A dlaczegóz? A dlategoz, ze spróbujcie pomnozyc przez siebie dwie macierze 1x3 ;). Tak dziala wlasnie mnozenie przez kropke - traktuje jak macierze. Kto uwazal na lekcjach algebry wie jakie są warunki zeby można bylo przemnozyc przez siebie dwie macierze: ilosc kolumn w tej "po lewej" musi się zgadzac z iloscia wierszy "tej po prawej". Dlatego poprawny wynik mnozenia skalarnego da nam polaczenie mnozenia z transpozycja:
>> a * b'
jeśli nie chcecie sobie zawracac tym glowy zawsze można uzyc wbudowanych funkcji:
>> dot(a,b)
da dokladnie ten sam wynik.
>> cross(a,b)
mnozenie wektorowe a x b (pamietajmy tutaj o 3ch wymiarach!)

Jest jeszcze kilka ciekawych operacji zwiazanych z wektorami:
>> u = a. * b
nie ma odpowiednika dzialania w algebrze. Da nam to w wyniku wektor o skladowych:
[0*2 1*3 2*4] czyli przemnaża w sposób: [a(1)*b(1) a(2)*b(2) .... a(n)*b(n)]
Czasem uzywa się takich rzeczy jak:
>> sum(a)
poda nam sume wszystkich wspolrzednych wektora.
Można tez zrobic cos takiego (o ile mamy waktor 10 elementowy w workspace):
>> sum(x(4:10))
da nam sume wspolrzednych od 4 do 10 włacznie.
Ciekawe jest tez polecenie
>> cumsum(x)
Wpiszcie cos do x i zobaczcie co dalo w wyniku.


Jak widac 1sza czesc dotyczy b. prostych rzeczy, ale jesli chcemy zeby kazdy chetny czegos sie dowiedzial musze zaczac od zera

DISIAJ DOJDA JESZCZE MACIERZE i RYSOWANIE FUNKCJI moze z ANIMACJA
wiec spokojnie czekac. Z animacja tylko jesli sie wyrobie do 18 bo pozniej na ognisko ide.

Zmieniony przez - Kuba_SnK w dniu 2009-07-04 15:53:44

Zmieniony przez - Kuba_SnK w dniu 2009-07-05 16:26:46

 
INSOMNIA
 Wysłana - 4 lipiec 2009 15:45      [zgłoszenie naruszenia]

II
MACIERZE


Co to jest macierz chyba kazdy wie. Jeśli nie to odsylam np. do wikipedii:
[pl.wikipedia.org/wiki/Macierz]
Najłatwiej sobie to wyobrazic jako wektor n wymiarowy, którego elementami są wektory m wymiarowe. Oczywiscie jeśli n = m to mamy macierz kwadratowa.
Jak można stworzyc dowolna macierz w matlabie:
>> A = [ 0 2 4 6 ; 2 4 6 8 ; 4 6 8 10 ]
i już mamy macierz z 4ma kolumnami i 3ma wierszami
sprawdzmy jaki ma wymiar ta macierz:
>> wymiar = size(A)
wypluje nam dwie wartosci (pierwsza dotyczy wierszy, 2ga kolumn)
>> wymiar(1)
wypluje nam wartosc 3
>>wymiar(2)
wypluje nam wartosc 4

UWAGA:
>> A = [ 0 2 4 6 ; 2 4 6 8 ; 4 6 8 ]
wypluje nam blad - jak już się zdecydujemy na 4 kolumny to mają być 4 kolumny do konca

OPERACJE NA MACIERZACH:
najpierw stwórzmy sobie jakas macierz (najlepiej kwadratową)
>> A = rand(4,4)
przy okazji poznalismy kolejna bardzo wazna funkcje - rand()
>>rand(1)
losuje nam liczbe rozkladu jednostajnego U(0,1)
więc teraz mamy macierz 4x4 liczb losowych z tego przedzialu - wazne... kolejne zmienne losowe są od siebie niezalezne. Przypominam o helpie - tam jest wszystko wypisane.
Stwórzmy sobie 2ga macierz:
>> B = rand(4,4)
Co można zrobic z 2ma macierzmi? A no można je dodac:
>> C = A + B
można odjac:
>> D = A - B
lub w 2ga strone:
>> E = B - A
można pomnozyc:
>>F = A * B
wiemy, ze mnozenie macierzy na ogól nie jest przemienne więc można w 2ga strone:
>>G = B * A
Mozna jeszcze przemnozyc przez skalar:
>>H = 4* A
lub
>>H = A*4
to jest akurat przemienne


UWAGA!!!
należy pamietac jakie są warunki mnozenia macierzy (pisalem już to wyzej), dodawania, odejmowania. Zakladam, ze osoby czytajace to mają pewne pojęcie o takich rzeczach, ale czasem bede cos przypominal.

Sprawdzmy wyznacznik macierzy:
>>det(A)
>>det(B)

Przypominam: wyznacznik istnieje tylko dla macierzy kwadratowych

Transponowanie macierzy odbywa się tak samo jak transponowanie wektora:
>> U = A'

Teraz znajdzmy macierz odwrotną spelniającą A * A^(-1) = 1
>> AA = inv(A)
sprawdzmy czy jest faktycznie taka:
>>A * AA
i wychodzi nam macierz jednostkowa
>>AA * A
daje to samo.
Ale można tez inaczej:
>>AAA = A^(-1)
sprawdzmy:
>> AAA * A
daje nam macierz jednostkowa
>>A * AAA
to samo

Z tego co pamietam jedno z nich jest szybsze i ogólnie lepsze - Waszym zadaniem jest sprawdzic które (np. na duzych macierzach).

Uwaga:
Jesli mamy macierz niekwadratową to moze istniec lewa i prawa jedynka/macierz odwrotna. Sa tez przypadki dla których przy macierzy kwadratowej lewa i prawa macierz odwrotna sa rózne

Teraz zajmijmy się rozwiazywaniem równan liniowych postaci Ax = b
gdzie A - macierz, x - szukany wektor, b - zadany wektor (oczywiscie wymiary mają takie jakie muszą mieć zeby to bylo sensowne)
[pl.wikipedia.org/wiki/Uk%C5%82ad_r%C3%B3wna%C5%84_liniowych]

Zakladamy, ze bedziemy mogli rozwiazac ten uklad jednoznacznie - det(A) jest rózny od 0

>> A = rand(4,4)
>> b = rand(4,1)
mamy macierz i mamy wektor wyrazów wolnych. Najpierw sprawdzmy czy mamy dobra macierz A. Jeśli jej wyznacznik jest zerem to powtórzmy operacje az do momentu uzyskania niezerowego wyznacznika.

Teraz czas na rozwiazanie tego ukladu - znalezienia takiego wektora x, który spelni równanie macierzowe Ax = b

Można zrobic to tak:
A^(-1) * A * x = A^(-1) * b
x = A^(-1) *b
>> x = inv(A) * b
lub
>> x = A^(-1) * b

ale lepszy jest metodą eliminacji gaussa:
>>x = A\b

W dokumentacji matlaba pisza tak:
[http://www.mathworks.com/access/helpdesk/help/techdoc/ref/inv.html]

Jak widac szybsza jest eliminacja Gaussa (jak bedziemy mieli macierze 200 x 200 i w kazdym kroku trzeba będzie znaleźć rozwiazanie to docenicie zysk czasu na iteracji)

Dobra, cos już wiemy, ale wypadaloby się jeszcze dowiedziec jak się dostac do kazdej komorki macierzy, wiersza czy kolumny (tez jest to potrzebne często). Tworzymy macierz:
>> A = rand(10,12)
przy okazji zobaczymy jak wyglada wydruk macierzy, kiedy się nie miesci w jednej linijce.

Teraz za n i m bedziemy podstawiali jakieś liczby (oczywiscie odpowiadajace zakresom - w naszym wypadku n od 1 do 10 i m od 1 do 12)
>>A(n,m)
poda nam jeden element, który sobie siedzi pod indeksem (n,m) - przeciecie n-tego wiersza i m-tej kolumny.
Jeśli chcemy dostac tylko 1szy wiersz:
>>A(1,:)
i go dostaniemy
>>A(1:3,:)
i dostajemy macierz stworzona z wierszy 1, 2 i 3.
>>A(1:2:6,:)
zapis 1:2:6 znamy już ... od 1 co 2 do 6 włacznie.
Czyli Dostajemy w wyniku macierz stworzona z wierszy 1, 3, 5 macierzy A.

Teraz kolumny
>>A(:,1)
dostajemy wektor - pierwsza kolumne macierzy A
>>A(:,10:12)
macierz stworzona z kolumn 10, 11 i 12 macierzy A

analogicznie do wierszy.


Sa jeszcze wbudowane funkcje tworzace macierze:

>>A = eye(4,3)
tworzy macierz stworzona z 2ch liczb: 0, 1 ... jedynki leza na głownej przekatnej - diagonalii, a zera na pozostalych miejscach.
>>A = zeros(4,3)
macierz, której wszystkie elementy to 0
>>A = ones(4,3)
macierz, której wszystkie elementy to 1

oczywiscie macierze o wymiarach 4x3, ale mozna dac inne liczby

Jeszcze mi sie przypomnialo o takiej waznej funkcji jak repmat
>>help repmat
czyli po prostu kopiuje/replikuje macierze/wektory
przyklad:
>>x = [0 1 2 3 5]
>>y = repmat(x,1,1)
nie rozni sie niczym od komendy
>>y = x
ale za to
>>y = repmat(x,3,1)
tworzy nam macierz, która jako kazdy wiersz ma wektor x
>>y = repmat(x,3,2)
teraz (schematycznie zapisujac) macierz wyglada tak:
x x
x x
x x
i podobnie mozna ja stowrzyc:
>>y = [x x ; x x ; x x]

polecam pobawic sie tymi komendami, zobaczyc gdzie wywali bledy i analizowac. Przywyknie sie do tego i bedzie latwiej. A jesli cos jest niejasne to smialo pytac. Szczególnie zobaczyc co sie dzieje przy rozwiazywaniu ukladów równan liniowych kiedy macierz wspolczynnikow A jest nieodwracalna


Wiemy juz cos o macierzach - na chwile obecna mysle, ze tyle nam wystarczy.
Zaraz bedzie rysowanie wykresów.








Zmieniony przez - Kuba_SnK w dniu 2009-07-05 16:51:52

 
INSOMNIA
 Wysłana - 4 lipiec 2009 16:32      [zgłoszenie naruszenia]

III
WYKRESY









Fajnie robic jakieś operacje na macierzach czy wektorach, ale jeszcze fajniej stworzyc z tego jakis wykres. Zwykle wykres mówi nam więcej niż wzór - ciezko wyobrazic sobie np. rozklad B-E czy F-D dla danej temperatury, ale majac wykres już wiemy co się dzieje.
Najpierw zajmiemy się wykresami 2D czyli w ukladzie X-Y (podam jeszcze komendy na logarytmiczne wykresy, ale nie za często z nich korzystam, chociaz nie ukrywam - są przydatne).
Do tworzenia wykresów sluzyc nam będzie funkcja plot(x,y) - rysuje wektor y wzgledem ektora x. Czy normalnie y = f(x). Pamietac należy, ze mamy tutaj do czynienia z wektorami (pozniej bedą to punkty - jak np. bedziemy chcieli stworzyc zwykly rzut w 2D to uzyjemy plot, ale argumentami beda wektory 1-wymiarowe).
Stwórzmy sobie funkcje liniową f(x) = a*x + b:
>> x = 0:0.01:1;
to są argumenty funkcji
>>a = 2
wspolczynnik kierunkowy
>>b = 1
>>y = a*x + b;
i mamy już wektor wartosci funkcji, teraz zostalo tylko rysowanie.
>>plot(x,y)
i dostaniemy wykres.
Popróbowac z innymi wartosciami a i b + innymi zakresami wartosci x.
Zmienmy tak:
>>x = 0:0.1:1
trzeba jeszcze przeladowac y'ka bo zrobienie teraz wykresu wywali nam blad:
>>plot(x,y)
wektory muszą mieć ta sama dlugosc
>>y = a*x + b
>>plot(x,y)
niby nic się nie zmienilo, ale to tylko pozory - teraz mamy tylko 11 punktów interpolujacych wykres.
>>plot(x,y,'r')
da nam wykres kolorem czerwonym
>>help plot
da nam podstawowe informacje o funkcji + poda jakie są skróty kolorów
>>plot(x,y,'r+')
i mamy czerwone krzyzyki - informacje o tym dostalismy tez w helpie.
Załóżmy, ze chcemy porównac 2 funkcje liniowe i ta 2ga ma być interpolowana wieksza iloscia punktów:
>>x2 = 0:0.05:1;
>>a2 = 1.5
>>b2 = 0
>>y2 = a2*x2 + b2;
>>plot(x2,y2)
ale chcemy mieć 2 funkcje na jednym wykresie. Są na to (przynajmniej) dwa sposoby:
>>plot(x,y,x2,y2)
lub
>>plot(x,y)
>>hold on
>>plot(x2,y2)
wazne!! - nie zamykamy okna z wykresem po pierwszym wykresie.
Mozemy tez uzyc wczesniej poznane komendy zmiany koloru i makerów:
>>plot(x, y, 'r+', x2, y2, 'go')

prawda, ze ladne?
oczywiscie można to rozdzielic przez komende "hold on" tak jak wyzej to zrobilem. Osobiscie preferuje rozdzielanie - czytelniejsze mi się wydaje.

Zrobmy teraz ciekawszy wykres niż funkcja liniowa
>> x = 0:0.01:2*pi
>>y = sin(x)
>>plot(x,y)

jak widac wykres konczy się szybciej niż obszar wykresu - srednio to wyglada. Nie zamykajac okna wykresu wpisujemy komende:
>>axis tight
i mamy najlepiej dobrane osie.
Zakres osi można podawac tez "z reki"
>>axis([a b c d])
gdzie:
a - minimalna wartosc x
b - maksymalna wartosc x
c - minimalna wartosc y
d - maksymalna wartosc y

sprobowac z roznymi wartosciami

Teraz sprawdzmy co się stanie jak zmniejszymy gestosc x'a:
>>x = 0:0.5:2*pi
>>y = sin(x)
>>plot(x,y)
już nie wyglada tak gladko - mamy za malo punktów, reszte pomiedzy interpolowana jest liniowo.

Teraz zrobymy wykres tylko jednego punktu - przyda się pozniej

>>plot(0.4, 0.2)
chyba nie muszę tlumaczyc
>>plot(0.4, 0.2, 'rx')
tez jasne
>>plot(0.4, 0.2,'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'blue', 'Marker', 'o');
tutaj cos nowego, ale tez mocno intuicyjne - szczególnie jak się samemu przetestuje rózne wartosci tam gdzie jest 'none', 'blue', 'o'

Tego bedziemy uzywac do prostych symulacji kuleczek więc warto zapamietac komende.

Wydaje mi się, ze podstawy rysowania wlasnie przedstawilem.
Można jeszcze rysowac w pollogarytmicznych czy logarytmicznych ukladach:
SEMILOGX, SEMILOGY, LOGLOG
najlepiej uzyc helpa i zobaczyc co wypluje.


W nastepnej czesci m-pliki czyli to czego nam do szczescia brakuje


Zmieniony przez - Kuba_SnK w dniu 2009-07-05 16:46:23

Zmieniony przez - Kuba_SnK w dniu 2009-07-05 16:46:48

 
INSOMNIA
 Wysłana - 4 lipiec 2009 17:46      [zgłoszenie naruszenia]

IV
M-PLIKI


Napisalbym, ze najwazniejsze, ale co nam z m-plikow bez wektorów czy macierzy?
Ale jest to to w czym bedziemy caly czas pisac - nie da się (chyba) napisac programu w workspace. Cale serce programu gdzies się musi znajdowac i tym wlasnie są m-pliki.
Tworzy się tak:
file--> new -->m-file
i otworzy nam się okno edytora, w którym spedzimy reszte czasu.
Skupimy się na funkcjach więc pierwsza linijka wyglada tak:
function [a1, a2, a3,..., an] = nazwa_funkcji(arg1, arg2, ..., agrn)

a1 - an : rzeczy, które ma funkcja zwracac
arg1 - argn: argumenty funkcji

oczywiscie funkcja może nie przyjmowac i nie zwracac argumentów

zobaczmy na przykladzie (cialo m-pliku bede wpisywal w %%%, które tutaj są "komentarzami")

%%%%%%%%%%%%%

function zwrot = pierwsza(argument, mnoznik)

zwrot = mnoznik * argument; %jestem komentarzem - i w tej linijce jest cala magia programu

%%%%%%%%%%%%%

i to jest cale cialo pliku... zapisujemy - pod nazwa pierwsza
i teraz w workspace:
>> wynik = pierwsza(15, 2)
kto zgadnie co nam podstawi pod wynik?
Jeśli zgadles to znaczy, ze cos już wiesz

analogicznie dla większej liczby wynikow:

%%%%%%%%%%%%%

function [wynik1, wynik2] = pierwsza(argument,mnoznik)

wynik1 = mnoznik*argument;
wynik2 = argument/mnoznik;

%%%%%%%%%%%%%

wywolujemy:
>>[xx,yy] = pierwsza(2,5)
i znowu wyniki są oczywiste

oczywiscie jako argument można podac wektor badz macierz - sprawdzic co się dzieje wtedy

dodajac komendy: tic, toc można sprawdzic jaki był czas wykonywania programu

%%%%%%%%%%%%%

function [wynik1, wynik2] = pierwsza(argument,mnoznik)

tic

wynik1 = mnoznik*argument;
wynik2 = argument/mnoznik;

toc
%%%%%%%%%%%%%

tutaj wyjdzie zero jeśli mamy maly wektor - znaczy to, ze dość szybko poszlo


Teraz czas na pętle i instrukcje warunkowe... bo co to za program bez petli?
Akurat w MatLabie petle są strasznie wolne (serio) więc jeśli się da to ich unikamy - lepiej robic repmat() i kombiniwac, ale często się nie da. Zreszta może sami pozniej wymyslicie optymalizajce programów?
Jeśli ktos pisal np. w C++ to petle zna, delikatnie się róznia skladnia, ale zasady dzialania są takie same.
Główne petle i instrukcje warunkowe to:
for, while, if,.

1. Petla for
Przykład:

%%%%%%%%%%%%%

function x = cosrobimy(argument)

x = 0;

for i = 1:1:argument
x = x+1;
end

%%%%%%%%%%%


podstawiamy na poczatek x = 0
teraz wchodzimy w petle - jeśli argument jest <1 to od razu z niej wyjdziemy. Najlepiej to sprawdzic co się stanie dla kilku wartosci, czy gdzies wywali blad, jaka wartosc x zwroci.
Co iteracje mamy do x dodac 1 (lub podstawic stary x powiekszony o 1)
Zwróccie uwage na "end" zamykajacy petle - o tym nie można zapomniec.
i = 1:n:argument
znaczy: zacznij od 1 .. dodaj n az dojdziesz do argument - najlepiej wstawic kilka wartosci i zobaczyc jakie beda wyniki, jeśli chcemy zobaczyc wyniki poszczególnych iteracji petli to usuwamy ";" na koncu linii: x = x+1;


2. Pętla while

%%%%%%%%%%%%%

function x = cosrobimy2(argument)

x = 0;

while(argument < 10)
x = x+1;
argument = argument+1;
end

%%%%%%%%%%%%%%

czyli jeśli argument jest mniejszy niż 10 to wchodzi w petle i ja wykonuje az argument będzie >= 10. Kolejny raz pojawia się "end" na koncu - wazne.
Zobaczcie, ze jeśli zamienilbym petle tak:

while(argument < 10)
x = x+1;
end

to przy podaniu argumentu mniejszego niż 10 nigdy by się nie skonczyla (bo zawsze będzie mniejszy), a po podaniu 10 lub większego program nigdy by nie wszedl w petle i x = 0. jeśli się nie konczy to naciskamy CTRL+C - koniec wykonywania funkcji.

Oczywiscie można zastosowac spojniki (?) logiczne jak "lub" czy "i" tutaj uzywa się takich samych jak w C++:
// - lub
&& - i

zmienmy petle na:

while(argument < 10 // x < 20)
x = x+1;
argument = argument+1;
end

zastanowic się co powinno wywalic dla kilku wartosci argumentu. Pozniej sprawdzic wpisujac te wartosci.
Podobnie zrobic dla:

while(argument < 10 && x < 20)
x = x+1;
argument = argument+1;
end


3. Instruncja If

przykład:

%%%%%%%%%%%%%

function x = cosrobimy2(argument)

x = 0;

if(argument < 0)
x = x+1;
elseif(argument < 10)
x = x+2;
else
x = x+3;
end

%%%%%%%%%%%%%%

Chyba intuicyjne, nie? Ale - jeśli argument jest < 0 to dodaj 1 do x. Jeśli jest większy niż 0, ale mniejszy niż 10 to dodaj 2, a jeśli jest inne niż te 2 intrukcje to dodaj 3

jeśli zmnienilbym cialo funkcji na:

%%%%%%%%%%%%%

function x = cosrobimy2(argument)

x = 0;

if(argument < 0)
x = x+1;
end
if(argument < 10)
x = x+2;
else
x = x+3;
end

%%%%%%%%%%%%%%

to argument < 0 i wchodzimy w 2 instrukcje


zadanie dla Was:

stworzyc program silnia(argument), który zwraca silnie liczby - jakiejs normalnej wielkosci - 10-15, nie musi dzialac dla 1000000
I oczywiscie przyzwyczaic się do petli i pobawic się nimi... sami mozecie wymyslac programy i testowac co się stanie.
Zaraz szybkie animowanie prostej funkcji i na dzisiaj koniec - jutro pierwsze symulacje.

 
INSOMNIA
 Wysłana - 4 lipiec 2009 18:19      [zgłoszenie naruszenia]

V
ANIMACJE



Czyli to co tygryski lubia najbardziej - animujemy!

wezmy sobie taka funkcje:
f(x) = A * sin(k*x - omega * t)

ktos wie jakiego równania rozwiazaniem jest ta funkcja? Jeśli tak to swietnie

%%%%%%%%%%%%%%%%

function animacja(k,omega,T, A)

t = 0:0.01:T; % tworzymy horyzont czasu
x = 0:0.01:2*pi; % tworzymy horyzont przestrzeni

%teraz wchodzimy w petle
for i = 1:length(t)
y = A*sin(k*x - omega*t(i)); %opis poza cialem funkcji
plot(x,y) %rysujemy
axis([0 2*pi -A A]) %ustawiamy osie -powinnismy wiedziec o co tutaj chodzi
drawnow; %kaze rysowac co krok
end

%%%%%%%%%%%%%%%%

główna magia dzieje się w linijce:
y = A*sin(k*x - omega*t(i));
zobaczcie jakie wartosci ma wektor t - horyzont czasu. Tworzymy wartosci y dla odpowiednich wartosci x ... dla kazdej chwili czasu. Caly czas nadpisujemy jako y - nie potrzebujemy tego trzymac w pamieci

linijke:
drawnow;
mozemy zamienic na
getframe;
wtedy będzie robilo to troche wolniej, ale przydaje się jeśli zamienimy petle na:

for i = 1:length(t)
y = A*sin(k*x - omega*t(i));
plot(x,y)
axis([0 2*pi -A A])
M(i) = getframe
end
movie(M)


i mamy swój pierwszy film

oczywiscie trzeba wywolac jakos funkcje, np.:
>>animacja(1,10,1,1)

jeśli przesadzimy z czasem koncowym to może się dluuugo animowac.

Teraz zapiszmy to w pliku AVI z dobra jakoscia

UWAGA!!!
jeśli wyłączymy program przed koncem wstawiania klatek do filmu to niestety - zostanie nam plik, na który nic nie nadpiszemy i trzeba będzie zmieniac nazwe pliku, w który chcemy wpisac - dlatego najpierw robimy tym drawnow lub getframe, a jeśli jestesmy pewni, ze wszystko idzie ok to mozemy zapisac do AVI - najlepsza metoda (szczególnie, ze zapisywanie do AVI troche trwa).

Mamy nasz poprzedni program:

%%%%%%%%%%%%%%%%

function animacja(k,omega,T, A)

t = 0:0.01:T;
x = 0:0.01:2*pi;

%teraz wchodzimy w petle
for i = 1:length(t)
y = A*sin(k*x - omega*t(i));
plot(x,y)
axis([0 2*pi -A A])
drawnow;
end

%%%%%%%%%%%%%%%%


teraz przeróbmy go tak zeby zapisal nam animacje do pliku moja1sza.avi

%%%%%%%%%%%%%%%%

function animacja(k,omega,T, A)

t = 0:0.01:T;
x = 0:0.01:2*pi;

%tutaj są wazne rzeczy dla pliku avi
%%
fig=figure('units','normalized','outerposition',[0.1 0.1 0.9 0.9]); %pozniej to opisze
aviobj = avifile('moja1sza.avi', 'compression','Indeo5') %nazwa i sposob kompresji
aviobj.fps = 25; %ilosc klatek na sekunde
aviobj.quality = 100; %jakos - 100 to max
%%

for i = 1:length(t)
y = A*sin(k*x - omega*t(i));
plot(x,y)
axis([0 2*pi -A A])
F = getframe(fig); %jako klatke wstawia to co jest figura - wykresem w naszym wypadku
aviobj = addframe(aviobj,F); %wstawia do klatke za klatka
end

close(fig); %zamyka wykres w naszym wypadku
aviobj = close(aviobj); %zamyka plik AVI - wazne

%%%%%%%%%%%%%%%%


Teraz nie dam rady więcej opisac bo wychodze - chcialem tylko Wam pokazac jak to się robi. Jutro reszta.
PS jeśli kopiujecie programy z tego pliku to nie wiem czy będzie ok bo mi "-" zmienia i muszę je sam wpisywac.
Zadanie dla Was:
zrobic kilka animacji funkcji - sami powymyslajcie. Jeśli nic nie widac na wykresie - calkiem mozliwe, ze axis([...]) jest zle dobrane. Zobaczcie co się stanie jeśli przy tworzeniu animacji dacie CTRL+C (trzeba będzie zmnienic nazwe pliku w tej linijce:
aviobj = avifile('moja1sza.avi', 'compression','Indeo5')
)
i co się stanie jak w trakcie zapisywania do AVI otworzycie np. firefoxa czy cos innego nakladajacego się na pole wykresu

 
INSOMNIA
 Wysłana - 6 lipiec 2009 16:37       [zgłoszenie naruszenia]

VI
CWICZENIE


Pierwsze praktyczne cwiczenie z wykorzystania MatLab'a.
Pozniej cos dopisze. Zrobilem wczoraj, ale net mi padl i dopiero teraz wrzucam. Maja dane historyczne indexu WIG20 potraktujemy indeks jakby podlegal geometrycznemu ruchowi browna i sprobujemy ocenic jaki bedzie dzisiaj na zamknieciu - czyli juz za 10min .

PS... nie daje gwarancji, ze dobrze wyliczylem parametry - musze to jeszcze sprawdzic.












Zmieniony przez - Kuba_SnK w dniu 2009-07-06 16:42:22

[Powiadom mnie, jeśli ktoś odpowie na ten artykuł.]



 
Przegląd tygodnia Temat zamknięty

MatLab - kurs