Wykład 3 - wmiRepo

Transkrypt

Wykład 3 - wmiRepo
Adam Szustalewicz
Wykład 3:
1
Matematyka obliczeniowa 2012
W.2
22.02.2012
Funkcje, pętle, instrukcje warunkowe
Uruchamianie Matlaba z domu – cz. 2 – w trybie tekstowym
Na razie, potrafię spod Windowsów uruchomić Matlaba w pracowni Instytutu jedynie w trybie tekstowym. Zatem
obrazków nie będziemy oglądać on-line, ale zapisany plik obrazka – za pomocą przeglądarki...
W trybie graficznym potrafię pracować jedynie pod UBUNTU; proszę zorganizować sobie płytkę z programem... o
UBUNTU będzie na wykładzie następnym.
• Za pomocą PUTTY łączymy się z chaosem np.
chaos.math.uni.wroc.pl
(bo można za pomocą numeru), podając odpowiednie hasło,...
• Za pomocą ssh przechodzimy na komputer w pracowni, pracujący pod LINUXem
numery podam na wykładzie
podając odpowiednie hasło...
• Przechodzimy do public_html , do kartoteki wewnętrznej... i tam uruchamiamy Matlaba.
• Pracujemy w okienku komend – podajemy komendy lub uruchamiamy dostępne w kartotece programy...
• Drukowane wyniki tekstowe widzimy (można je zapisać w pliku, najprościej za pomocą diary , a plik z wydrukowanym obrazkiem możemy obejrzeć przeglądarką lub ściągnąć do komputera w domu.
c.d.n.
Wracamy do Matlaba
2
Jeszcze operacje na macierzach (przed pętlami)
1. Utwórzmy trzy macierze
» A = [1 2 3; 4 5 6; 7 8 9]; B = [ [1 2;3 4] [5;6] ]; a = 1:16;
Bez pomocy komputera proszę odpowiedzieć jakie wyniki otrzymamy wykonując kolejne komendy wykonywane
wierszami
» size(A)
» A(2)
» A(end, end)
» A([1 3 4 5])
» A([1;3;4;5])
» A([1;3;4 5])
» B(1,:) = A(2,:) » B(3,1) = 3
» B==0
» B==3
» B(B==0) -1
» size(B(B==3))
» B(B<4)
» B>2
» B>2 + 1
» B(logical([0 -1 1 ,0.2]))
» B(logical([0 1:-.2:0.2,0])) » a=reshape(a,4,4) » a1=a(: , 4:-1:1) » a2 = a(end: -1:1, end:-1:1)
2. Utworzyć wektor, w którym każdemu indeksowi k parzystemu będzie odpowiadać kwadrat k, a indeksowi
nieparzystemu – sześcian k .
3.
• Mając dany wektor x, utworzyć tablicę A o n wierszach będących kopiami x.
• Jak teraz, w utworzonej tablicy wyzerować wiersze nieparzyste, a elementy większe od 3 zamienić na −1 ?
• Przygotować funkcję, która zrealizuje przedstawione zadanie...
3
Skrypty, funkcje
(1) Skrypt jest ciągiem instrukcji matlabowskich działających na zmiennych dostępnych w przestrzeni roboczej Matlaba. Nadane wewnątrz skryptu nowe wartości zmiennych pozostają do dyspozycji użytkownika po zakończeniu
pracy skryptu. Zbiór skryptowy może mieć dowolną dopuszczalną nazwę z rozszerzeniem .m (m-file).
(2) Funkcja jest podobna do skryptu, ale może zawierać argumenty wejścia lub wyniki. Rozpoczyna się wierszem
z nazwą funkcji, np.
function [ <wynik1>, <wynik2> ] = <nazwa_funkcji> ( <argument1>, <argument2> ) .
Instrukcje w treści funkcji powinny nadać wartości <wynikom>.
Zmienne używane w zbiorach funkcyjnych są zmiennymi lokalnymi. Wartości <argumentów> zostają skopiowane
do nowo utworzonych zmiennych lokalnych o takich samych nazwach. Po zakończeniu pracy funkcji wszystkie
zmienne lokalne zostają usunięte z Workspace Matlaba. Nazwa zbioru funkcji (m-file) powinna mieć postać
<nazwa_funkcji>.m
1
Adam Szustalewicz
Matematyka obliczeniowa 2012
W.2
22.02.2012
• Komentarz, znajdujący się w początkowych wierszach funkcji lub skryptu, i pisany od początku wiersza będzie
wyświetlany po wydaniu komendy help <nazwa_zbioru> .
• Skrypt lub funkcja najczęściej kończą działanie po dojściu do końca swojej treści. Instrukcja return służy do
wcześniejszego zakończenia pracy.
skrypt Przykładem skryptu był plik obrazek1.m utworzony i zapisany na wykładzie 1.
skrypt + funkcja (2 oddzielne pliki)
% obrazek2.m
clc, close
u=0:.1:pi;
v=nowafunkcja(u);
plot(u,v)
hold on
plot(u,v,’r+’)
hold off
function y=nowafunkcja(x)
% nowafunkcja.m
% opis tematu...
% dane...
% UWAGA
% wyniki
% data opracowania...
% autor...
y=sin(x);
skrypt + funkcja (jeden plik)
function obrazek3
% obrazek3.m
u=0:.1:pi;
v=feval(@nowafunkcja,u);
plot(u,v,u,v,’r+’)
% -----------------------function y=nowafunkcja(x)
y=sin(x);
4
Instrukcje, funkcje
1. Instrukcje (komendy) mają postać:
zmienna
= wyrażenie (instrukcja podstawienia) lub
wyrażenie
(np. wywołanie funkcji, lub obliczanie wartości wyrażenia jak kalkulator).
1a. Jeżeli instrukcja jest zbyt długa i nie mieści się w wierszu,
to możemy jej fragment przenieść do linii następnej stosując co najmniej trzy kropki, np:
» b = A *. . .
a;
1b. Instrukcje pisane w jednym wierszu oddzielamy od siebie średnikami lub przecinkami.
1c. Jeżeli instrukcja nie jest zakończona średnikiem, to Matlab wypisuje otrzymany wynik instrukcji w okienku
komend.
2. Do dyspozycji mamy wiele standardowych funkcji arytmetycznych m.in.: sqrt, exp, log, log10,
log2, sin, cos, tan, abs, sqrt, sign, fix, floor, ceil, round, mod, rem. . . help elfun wyświetla m. in:
Rounding and remainder.
fix
- Round towards zero.
floor
- Round towards minus infinity.
ceil
- Round towards plus infinity.
round - Round towards nearest integer.
mod
- Modulus (signed remainder after division).
rem
- Remainder after division.
sign
- Signum.
Proponuję obejrzeć wyjaśnienia Matlaba na temat definicji wymienionych funkcji... Np:
>> help rem
REM
Remainder after division.
2
Adam Szustalewicz
Matematyka obliczeniowa 2012
W.2
22.02.2012
REM(x,y) is x - n.*y where n = fix(x./y) if y ~= 0. If y is not an
integer and the quotient x./y is within roundoff error of an integer,
then n is that integer. The inputs x and y must be real arrays of the
same size, or real scalars.
By convention:
REM(x,0) is NaN.
REM(x,x), for x~=0, is 0.
REM(x,y), for x~=y and y~=0, has the same sign as x.
Note: MOD(x,y), for x~=y and y~=0, has the same sign as y.
3. Często, pisząc instrukcję podstawienia możemy zasłonić istniejącą już nazwę, np:
» sin=5; Przywrócić funkcję sin możemy jedynie usuwając utworzoną zmienną sin komendą:
» clear sin;
Nazwa end nie da się zasłonić:
» end=5;
=⇒
??? end = 5 . . . Error: Missing operator, comma, or semicolon.
5
Instrukcje warunkowe
(1) if <warunek> <instr1 >; <instr2 >; . . . <instrn >; end
(zamiast średników mogą być przecinki — co to zmieni?)
(3) if
(2) if
<warunek1>
<instrukcjeA>
elseif <warunek2>
<instrukcjeB>
elseif <warunek3>
<instrukcjeC>
...
else
<instrukcjeE>
end
<warunek>
<instrukcjeA>
else
<instrukcjeB>
end
6
Wyrażenia logiczne
W instrukcji warunkowej, w miejscu <warunek> można umieścić
(1) wyrażenie arytmetyczne — <warunek> otrzymuje wartość:
true – jeżeli wartość wyrażenia jest różna od zera,
false – w przeciwnym razie.
(2) wyrażenie logiczne
Przykład z równania kwadratowego:
if
bˆ2-4*a*c==0&a˜=0 x=-b/(2*a), end
(Widać, że warto używać nawiasów i rozstrzelić tekst w kilku wierszach.)
7
Pętle, instrukcje break i continue
1. pętla for
for <zmienna> = < <lista> definiująca kolejne wartości <zmiennej> >
< <instrukcje> wykonywane dla każdej wartości <zmiennej> >
end
3
Adam Szustalewicz
Matematyka obliczeniowa 2012
W.2
22.02.2012
przykłady:
y=pi; s=[];
for x=0:y, s=[s x]; end
% tworzenie wektora s
for x=s,
h=x
% co bedzie wydrukowane?
end
a=[s; s’ s’+1 s’ [4 3 2 1]’]; % obejrzec macierz a
for x=a,
h=x
% co bedzie wydrukowane?
end
2. pętla while
while <wyrażenie>
<instrukcje>
end
<instrukcje> są wykonywane dopóty, dopóki <wyrażenie> ma wartość prawdy logicznej.
przykład:
n=0; N=55.444;
while n^2 < N , n=n+1; end
n
3. instrukcja break
— powoduje przerwanie pętli.
4. instrukcja continue
obrotu pętli.
8
% co bedzie wydrukowane?
—
powoduje pominięcie dalszych instrukcji wewnątrz pętli i przejście do następnego
Zadania na ćwiczenia
1. Co będzie wydrukowane po wykonaniu programu:
clc, clear,
x = [ ];
for a = [ 7
for b =
x =
if
close
9 15 20 6 ]
a : 16
[ x, b ];
b < 10
break
end
end
end
x
2. Jakie wartości otrzymamy:
(a) round(0.5) =
(e) ceil(0.2) =
(i) mod(20, 7) =
(b) round(−0.5) =
(f ) ceil(−0.2) =
(j) mod(20, −7) =
(c) f ix(0.7) =
(g) f loor(0.7) =
(k) mod(−20, 7) =
(d)
(h)
(l)
f ix(−0.7 + 4.99i) ′ =
f loor(−0.7 + 4.99i) ′ =
mod(−20, −7 + 4.99i) ′ =
3. Zastąpić matlabowskie działania na macierzach: C = A + B , C = A ∗ B , C = D ∗ (A + B) pętlami for,
a potem pętlami while .
4. Napisać funkcję generującą macierz rozmiaru n z wartościami losowymi, z zadanego przedziału (a, b).
5. Napisać funkcję
f unction tak = czy_magiczna (A)
sprawdzającą, czy rzeczywiście zadana macierz A jest macierzą magiczną, i dającą odpowiedź 0 albo 1 .
Sprawdzić jakie cechy ma posiadać macierz magiczna...
6. Niexh a i b będą długościami przyprostokątnych trójkąta prostokątnego (albo częściami rzeczywistą oraz
urojoną liczby zespolonej).
Policzyć długość przeciwprostokątnej (lub moduł liczby zespolonej) dla danych:
(a) a = 1 , b = 1
Napisać odpowiednią funkcję...
4
(b)
a = 10200 , b = 10200
(c) a = 10−200 , b = 10−200
Adam Szustalewicz
Matematyka obliczeniowa 2012
W.2
22.02.2012
7. Ułożyć schemat blokowy, a następnie zaprogramować grę w odgadywanie przez komputer wybranej przez nas
liczby naturalnej z przedziału [1, 1000] .
Komputer (tzn. program) proponuje jakąś liczbę, a my odpowiadamy znakiem:
=
>
<
jeżeli jest to liczba wybrana i gra się kończy,
jeżeli nasza liczba jest większa od proponowanej,
jeżeli nasza liczba jest mniejsza od proponowanej.
Po odgadnięciu liczby program podaje ilość prób. (Jak wczytywać znaki? zob. help input.)
9
Zadania na pracownię
1. Sprawdzić czy zadania z ćwiczeń zostały dobrze rozwiązane...
2. Sprawdzić działanie komend:
(a)
(b)
(c)
(d)
(e)
rand , rand(2, 3) , rand(3, 2) , fix(rand) , fix(rand(3,2)) , fix(rand(2, 3)) , fix(10*rand) , i.t.d.
Niech A = pascal(4) , B = ones(4) , C = A + B , C = A - B , C = A * B .
Niech a = pascal(3) . Wyznaczyć 2 * a , a * 2 , a + 2 , 2 + a , a/2 , 2/a (czy jest tu błąd?).
Niech A = pascal(4) , x=[1; 1; 1; 1] Wyznaczyć x’ * A , A * x .
A = [2 1; 1 2] , B = inv(A) , A * B .
3. Za pomocą pętli obliczać wyznacznik macierzy kwadratowej; napisać funkcję...
4. (zadanie dla chętnych, WARTO!) Napisać skrypt, który na zadanym prostokącie:
Y D <= y <= Y G
XL <= x <= XP ,
(a) będzie generować rozkładem jednostajnym dwa punkty,
(b) a potem połączy je odcinkiem wygenerowanego koloru...
Program powinien działać w nieskończonej pętli, a przerwać go będzie można klawiszami CtrlˆC.
5. Napisać funkcję sprawdzającą czy zadana liczba całkowita jest liczbą pierwszą.
6. Opracować funkcję wyznaczającą zadaną ilość kolejnych liczb pierwszych, nie mniejszych od zadanej liczby a.
7. Napisać własną funkcję obliczającą NWD(a,b) dla liczb całkowitych a i b np. algorytmem Euklidesa.
8. Napisać własną funkcję obliczającą NWW(a,b)
biblioteczne dla NWD i NWW ?
dla liczb całkowitych a i b. Czy Matlab zawiera funkcje
9. Proszę dotrzeć do skryptu malującego obraz Dürera Melancholia – otwierając kolejno:
demos
Graphics
Images and Matrices
(przy końcu)
Proszę wykonać skrypt zamieszczony przed obrazkiem, zastępując imglist{4} przez imglist{5} ,
a następnie porównać macierz z wynikiem magic(5) . Wykorzystać również colormap(colorlabels2);
Albrecht Dürer (1471 – 1528): Melancholia
*
kwadrat magiczny nad skrzydłem anioła
(zaznaczony strzałką)
*
*
5