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