Wykład 2: Funkcje, podstawy grafiki 1 Skrypty, funkcje, zmienne

Transkrypt

Wykład 2: Funkcje, podstawy grafiki 1 Skrypty, funkcje, zmienne
Adam Szustalewicz
Wykład 2:
1
Laboratorium z Metod Numerycznych dla Chemii 2010 2010
W.2
17.11.2010
Funkcje, podstawy grafiki
Skrypty, funkcje, zmienne globalne
(1) Zbiór skryptowy, albo krótko skrypt, nie posiada argumentów wejściowych ani argumentów wyjściowych i
zawiera ciąg instrukcji matlabowskich działających na zmiennych dostępnych w przestrzeni roboczej Matlaba –
por. np. przykład 2.2 z wykładu 1-go. Nowe, zadeklarowane wewnątrz skryptu zmienne 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) Zbiory funkcyjne (funkcje) rozpoczynają się wierszem z nazwą funkcji, np.
function [ <wynik1>, <wynik2> ] = <nazwa_funkcji> ( <argument1>, <argument2> )
function <nazwa_funkcji> ( <argument1>, <argument2> )
lub
W treści funkcji powinny znajdować się instrukcje nadające wartości <wynikom> (o ile takie występują - funkcja
aszsunflower nie zawiera żadnych argumentów ani wartości).
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 przez funkcję
wszystkie zmienne lokalne zostają usunięte z Workspace Matlaba. Nazwa zbioru (m-file) powinna mieć postać
<nazwa_funkcji>.m
• Komentarz, znajdujący się bezpośrednio po pierwszym wierszu w funkcji albo w pierwszych wierszach skryptu,
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. Czasem działanie skryptu lub
funkcji należy zakończyć wcześniej i służy temu instrukcja return.
• Wewnątrz funkcji, poza <argumentami> można jeszcze korzystać ze zmiennych zewnętrznych, zdefiniowanych
jako zmienne globalne definicją
global a b delta
Definicja taka musi występować wewnątrz funkcji i na zewnątrz, np. w skrypcie, w którego treści funkcja ta
została wywołana.
2
Przykłady funkcji rekurencyjnych, instrukcja return
1. Silnia
function s=silnia1(n)
% wersja z petla for
if n<0
s=0;
% return
error(’zle: n<0’)
else
s=1;
for i=2:n
s=s*i;
end
end
function s=silnia2(n)
% wersja rekurencyjna
if n<0
s=0;
return
% error(’zle: n<0’)
elseif n==0 | n==1 % n<2
s=1;
else
s=n*silnia2(n-1);
end
czasy obliczeń ([ms])
n silnia1(n) silnia2(n)
18
0.0407
1.0617
38
0.0409
2.1932
170
0.0447
9.2477
2. Wieże Hanoi
function hanoi(n,a,b,c)
% wywolanie np: hanoi( 3, ’A’, ’B’, ’C’ ) ==>
if n==1
disp([’przesun krazek z kol. ’,a,’ na kol. ’,b])
else
hanoi(n-1,a,c,b)
disp([’przesun krazek z kol. ’,a,’ na kol. ’,b])
hanoi(n-1,c,b,a)
end
% tsilnie - skrypt testujacy.
a=170;
ile=5000;
tic
for i=1:ile
w=silnia1(a);
end
t=toc*1000/ile;
fprintf(’czas1 = %8.4f\n’,t)
tic
for i=1:ile
w=silnia2(a);
end
t=toc*1000/ile;
fprintf(’czas2 = %8.4f\n’,t)
wynik:
przesun
przesun
przesun
przesun
przesun
przesun
przesun
krazek
krazek
krazek
krazek
krazek
krazek
krazek
z
z
z
z
z
z
z
kol.
kol.
kol.
kol.
kol.
kol.
kol.
A
A
B
A
C
C
A
na
na
na
na
na
na
na
kol.
kol.
kol.
kol.
kol.
kol.
kol.
B
C
C
B
A
B
B
1
Adam Szustalewicz
3
Laboratorium z Metod Numerycznych dla Chemii 2010 2010
W.2
17.11.2010
Grafika
1. Podstawowe parametry tworzenia rysunku w Matlabie
Najprostszym sposobem rysowania wykresów 2- lub 3-wymiarowych jest zastosowanie komendy plot. Trzeba
ustalić co najmniej wartości zmiennej zależnej i możemy rysować. Kolejne punkty będą połączone albo nie –
zależnie od wybranych parametrów rysowania.
Wywołując help plot poznajemy standardowe możliwości doboru kolorów, symboli i stylów kreski:
b
g
r
c
m
y
k
blue
green
red
cyan
magenta
yellow
black
.
o
x
+
*
s
d
point
circle
x-mark
plus
star
square
diamond
v
^
<
>
p
h
triangle (down)
triangle (up)
triangle (left)
triangle (right)
pentagram
hexagram
:
-.
--
solid
dotted
dashdot
dashed
2. Istnieje mnóstwo dodatkowych parametrów rysunku
clear, clc, close all
x=[1.1 2.5 3 4 4.2 4.3];
y=linspace(1,-1,length(x));
figure,
plot(y), % line(1:length(y),y)
hold on % off
plot(x,y,’o-.r’)
legend(’tylko y’,’x,y’)
xlabel(’wartosci x’)
ylabel(’Y’)
% ty=ylabel(’wartosci Y’);
% get(ty)
% set(ty)
ylabel(’y’,’fontsize’,20,’rotation’,0,...
’fontangle’,’italic’)
title(’dwa wykresy’);
grid on % off
text(4,0.2,’tutaj: (4, 0.2)’)
dwa wykresy
1
0.8
tylko y
0.6
x,y
0.4
tutaj: (4, 0.2)
0.2
y
0
−0.2
−0.4
−0.6
−0.8
−1
1
1.5
2
2.5
3
3.5
wartosci x
4
4.5
5
3. Funkcja sunflower - Hahn B., Essential MATLAB, rozwiązanie zad. 7.4
30
function aszsunflower
% Hahn
n=1:1000;
d=137.51;
th=pi*d*n/180;
r=sqrt(n);
plot(r.*cos(th), r.*sin(th),’o’);
axis equal
20
10
0
−10
Proponuję zająć się ostatnim
zadaniem na pracownię...
−20
−30
−30
2
−20
−10
0
10
20
30
5.5
6
Adam Szustalewicz
4
Laboratorium z Metod Numerycznych dla Chemii 2010 2010
W.2
17.11.2010
Zadania na Ćwiczenia i na Pracownię
1. Dane są 3 liczby: a, b, c, traktowane jako współczynniki równania kwadratowego. Należy ułożyć schemat
blokowy, a następnie zaprogramować rozwiązywanie tego równania biorąc pod uwagę wszelkie możliwości ich
znikania (np. dla a = 0, b = 0, c ̸= 0 równanie jest sprzeczne). Należy
(a) napisać skrypt
(b) napisać funkcję
(c) napisać funkcję
rkwadratowe0
drukujący rozwiązanie,
function rkwadratowe1( a, b, c )
drukującą rozwiązanie,
function [ x1, x2, info ] = rkwadratowe2( a, b, c ) wyznaczającą rozwiązanie.
2. Napisać funkcję sprawdzającą czy zadana liczba całkowita jest liczbą pierwszą.
3. Opracować funkcję wyznaczającą zadaną liczbę kolejnych liczb pierwszych, nie mniejszych od zadanej liczby a.
4. Proszę dotrzeć do skryptu malującego obraz Dürera Melancholia – otwierając kolejno:
help
demos
Graphics
Images and Matrices
Proszę wykonać skrypt zamieszczony na końcu pliku przed obrazkiem, a następnie porównać macierz z wynikiem
magic(4) .
kwadrat magiczny nad skrzydłem anioła
(zaznaczony strzałką)
Albrecht Dürer (1471 – 1528): Melancholia
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 .
6. (GRAFIKA i Błędy numeryczne)
zadeklarować trzy funkcje obliczające wartości (x − 1)8 następującymi algorytmami:
•
•
•
y = x8 − 8x7 + 28x6 − ... – (algorytm zwykły),
y = ...(((x − 8)x + 28)x − 56)x + ... – (schemat Hornera),
a1 = x − 1; a2 = a1 ∗ a1; a4 = a2 ∗ a2; y = a4 ∗ a4 – (najmniej działań arytmetycznych).
Następnie narysować w jednym oknie wszystkie trzy wykresy na przedziale [0.98 , 1.02] , dobierając łatwe do
rozróżnienia kolory poszczególnych krzywych (łamanych). Wybrać ¨dobrą¨ kolejność rysowanych funkcji...
7.
Poprawimy słonecznik malując go np. tak:
(na razie wypełnianie wnętrz kółek różnymi
kolorami może być jeszcze zbyt trudne...)
*
*
*
3

Podobne dokumenty