1
Wprowadzenie do informatyki
Podstawy programowania w Matlabie – materiały
pomocnicze do ćwiczenia laboratoryjnego
Temat:
„Podstawy programowania
w językach wysokiego poziomu- środowisko obliczeniowe MATLAB”
Wykonali:
dr inż. BANASIAK Kazimierz kpt. mgr inż. KACZMAREK Paweł
Warszawa 2019 r.
2 ŚRODOWISKO OBLICZENIOWE MATLAB (MATrix LABoratory)
Matlab to proste w użyciu środowisko łączące obliczenia, wizualizację i programowanie. Zastosowania pakietu to:
• obliczenia matematyczne,
• algorytmy numeryczne,
• modelowanie i symulacja,
• analiza danych i wizualizacja,
• grafika inżynierska,
• aplikacje z wykorzystaniem graficznych interfejsów użytkownika GUI (Graphics User Interface).
Matlab jest systemem interaktywnym, którego podstawową strukturę danych stanowi dwuwymiarowa tablica dynamiczna o nieokreślonej z góry liczbie elementów. Takie podejście pozwala rozwiązywać wiele technicznych problemów, w szczególności opisanych za pomocą macierzy i wektorów, bez definiowania takich struktur (co nie jest możliwe w językach programowania np. typu C).
Dodatkowe biblioteki Matlaba (ang. toolboxes) umożliwiają stosowanie specjalistycznych technologii. Biblioteki składają się z funkcji Matlaba (tzw. m-plików), które poszerzają standardowy zestaw funkcji pakietu o możliwości rozwiązywania specyficznych problemów np.:
o Control System Toolbox- projektowanie układów sterowania o Optimization Toolbox - metody optymalizacji,
o Neural Network Toolbox - sieci neuronowe itp.).
Integralną częścią Matlaba jest Simulink - system, umożliwiający graficzne modelowanie i symulację układów.
Przykład budowy prostego układu i symulacji sygnału i jego wzmacniania przedstawiono na rysunku 1.1.
Rys. 1.1. Przykład Modelu w Simulinku i wyników jego uruchomienia
3 Pakiet Matlab składa się z podstawowych elementów:
1. język Matlab - język wysokiego poziomu, umożliwiający tworzenie małych programów, jak i kompletnych aplikacji, udostępniający funkcje, obsługę wejścia/wyjścia i elementy programowania obiektowego;
2. środowisko robocze Matlaba - zestaw narzędzi do zarządzania zmiennymi w przestrzeni roboczej, m-plikami, aplikacjami Matlaba oraz do importowania i eksportowania danych;
3. system graficzny - zawierający funkcje wysokiego poziomu do tworzenia 2D i 3D wykresów, funkcje przetwarzania obrazów i tworzenia animacji oraz wiele niskopoziomowych poleceń, umożliwiających kontrolę wyglądu tworzonych grafik i budowę graficznego interfejsu użytkownika (GUI);
4. biblioteka funkcji matematycznych - obejmuje zarówno funkcje podstawowe (np. sumowanie, funkcje trygonometryczne, funkcje liczb zespolonych), macierzowe (np. obliczanie macierzy odwrotnych, wartości własnych) oraz innych specjalnych funkcji matematycznych, np. funkcje Bessela, FFT (Fast Fourier Transform).
Program Matlab po uruchomieniu udostępnia interfejs graficzny użytkownika – rys. 1.2. Podstawowym oknem pracy interaktywnej jest okno Command Window. Użyte zmienne i macierze są pokazywane w oknie Workspace a ostatnie polecenia są pokazywane w oknie Command History. Ikony interfejsu umożliwiają m. in.:
- edycję plików programów;
- uruchamianie i testowanie programów.
Rys.1.2. Graficzny interfejs użytkownika środowiska Matlab
Praca z pakietem Matlab może odbywać się na dwa sposoby:
❑ w trybie bezpośrednim - robocze prowadzenie dialogu pomiędzy użytkownikiem a pakietem na zasadzie:
wpisywanie polecenia – odpowiedź - patrz na operacje macierzowe na rys. 1.3.
Rys. 1.3. Przykład wykonywania obliczeń macierzowych w pracy interaktywnej
Okno poleceń i wyników wykonania
4
Po uruchomieniu pakietu polecenia można wydawać bezpośrednio w oknie Matlaba. O gotowości świadczy znak zachęty (>>) w oknie Command Window.
❑ w trybie pośrednim - umożliwia efektywne wykonanie obliczeń i prezentację wyników za pomocą uruchomienia programu napisanego w języku pakietu Matlab, czyli tzw. skryptu pisanego w oknie edytora widocznym na rys. 1.4. Uruchamianie programu lub śledzenie jego wykonania instrukcja po instrukcji zapewniają opcje zakładki Debug.
Rys. 1.4. Skrypt programu animacji w Matlabie ilustrującego poszczególne kroki wykonywania i opisu wykresów
1. MATLAB- PODSTAWOWE POJĘCIA
Skrypt to plik zawierający ciąg instrukcji obliczeń zrozumiałych dla Matlaba. Jest zapisywany w pliku
z rozszerzeniem nazwa.m . Taki plik jest określany m-plikiem. Skrypt jest najprostszą formą programu stosowaną do prostych obliczeń. W tab. 2.1 przedstawiono przykład skryptu zapisanego np. w pliku Suma_N_Liczb.m.
Wykorzystane w skrypcie instrukcje disp, input i for Matlaba są omówione w dalszej części instrukcji. Poniżej pokazano wynik uruchomienia powyższego skryptu dla wprowadzonej liczby N=5.
Tabela 2.1. Przykład m-pliku w Matlabie1
Poniżej pokazano wynik uruchomienia skryptu dla wprowadzonej liczby N=5 Program sumuje N kolejnych liczb Ile liczb sumować? Podaj N= 5 Suma N kolejnych liczb=
15
5
Funkcja to specyficzny plik poleceń w języku Matlab, rozpoczynający się zawsze słowem kluczowym function.
Przykład struktury funkcji pokazano w tab. 2. 2.Po słowie kluczowym musi wystąpić nazwa funkcji. Po nazwie funkcji może wystąpić w nawiasach (…) lista parametrów przekazywanych do funkcji przy jej wywołaniu np. function s= SIL(n). Tu przed nazwa funkcji występuje parametr s (wynik obliczeń) zwracany przez funkcję. Tak zdefiniowana funkcja może być wywołana z innego programu lub z okna Command Window np. poleceniem:
>> wynik= SIL(n)
Tabela 2.2. Przykład programu funkcji
Ważne: Funkcja musi być zapisana w m- pliku o nazwie takiej samej jak nazwa funkcji !.
Program iteracyjny to program, w którym dla osiągnięcia wyniku zastosowano powtarzalne wielokrotnie instrukcje.
Np. przy obliczaniu silni (patrz tabela 2.2) mnożymy wielokrotnie wynik bieżący (patrz wiersz 8) przez kolejną liczbę.
Powtarzanie operacji jest też określane jako iteracja. Stąd mówimy o programach iteracyjnych. Do programowego wykonywania iteracji w Matlabie wykorzystuje się pętle programowe:
for lub while lub też wektoryzację obliczeń
W programie funkcji z tabeli 2.2 (wiersze 6-9) wykorzystano, omawianą dalej szczegółowo, pętlę for.
Program strukturalny
W przypadku konieczności złożonych obliczeń problem jest dzielony na mniejsze problemy rozwiązywane przez funkcje. Taki program to program strukturalny. Przykład pokazano w tabeli 2.3.
Tabela 2.3. Przykład programu złożonego z funkcji głównej i podfunkcji
Wynik obliczeń ( ze zmiennej funkcji s) będzie w utworzonej zmiennej wynik. Na ekranie będzie widoczny rezultat:
wynik=
120
Przykładowe wyniki programu z tabeli 2.3:
Podaj n calkowite n=5 Wynik obliczen: 5 ! = 120 Podaj n calkowite n=0 Wynik obliczen: 0 ! = 1 Podaj n calkowite n=-5
Podano n =-5 ujemne! Silnia nie istnieje
>>
6 Program strukturalny to program, który najczęściej składa się z:
A) jednego pliku zawierającego funkcję główną ( tu SilniaLiczbyN - patrz w tabeli 2.3) oraz funkcji składowych wywoływanych w funkcji głównej - tu tylko jedna funkcja SIL. Cały program zawierający wiele funkcji jest zapisywany w jednym pliku o nazwie dokładnie takiej jak nazwa funkcji głównej (tu SilniaLiczbyN). Ułatwia to zarzadzanie plikami w komputerze. Przy tego typu organizacji mówimy często o podfunkcjach.
B) głównego segmentu (skryptu) i funkcji własnych, które są zapisane jako oddzielne pliki o nazwach takich jak nazwa każdej wykorzystywanej funkcji. Taka wieloplikowa organizacja utrudnia zarzadzanie plikami.
Warto podkreślić, ze mogą być funkcje, które nie mają parametrów wejściowych (np. funkcje pobierające dane z klawiatury) lub wyjściowych ( np. funkcje drukujące wyniki).
W przedstawionym w tabeli 2.3 programie w funkcji głównej (wiersze 13 ,14 oraz 16,17,18) zastosowano bardziej złożone instrukcje wyprowadzania informacji na ekran (instrukcje sprintf, wektory tekstowe […] i instrukcje disp([…]). Umożliwiają one przejrzyste formatowanie informacji wynikowej i są omawiane w dalszej części instrukcji.
Uwaga:
Dystrybutorem oprogramowania Matlab w Polsce jest firma : ONT Oprogramowanie Naukowo Techniczne. Kraków
Aktualnie ( od 2 lat) studenci WAT mogą korzystać z darmowej licencji Matlaba, szczegółowe warunki licencji użytkownika oraz procedura instalacji dostępna jest na stronie internetowej WAT->Rozwój->Dystrybucja oprogramowania.
Informacje i przykłady dotyczące algorytmizacji i podstaw Matlaba są w książce:
K. Banasiak : Algorytmizacja i programowanie w Matlabie”
Książka ta ( również inne książki z zakresu studiów) jest dostępna w wydawnictwie BTC, księgarniach
internetowych i księgarniach naukowo- technicznych.
7
2. INSTRUKCJE WPROWADZANIA I WYPROWADZANIA DANYCH
W środowisku Matlab zmienne rzeczywiste np. x=12.345 czy L=321 są traktowane jako macierze o nazwach x i L i domyślnie o rozmiarach 1x1. Wpisanie w Matlabie polecenia np. L=321 spowoduje powołanie zmiennej L i nadanie jej wartości. Zmienne mogą też zawierać więcej liczb i są wtedy wektorami. Powołanie wektora liczb wymaga użycia w zapisie nawiasów kwadratowych. Np. zapis W=[1 3 5 7] spowoduje utworzenie wektora wierszowego a zapis z innymi separatorami liczb np. K=[1; 3; 5; 7] spowoduje utworzenie wektora kolumnowego o identycznej zawartości jak W. Zmienne mogą zawierać kilka równolicznych grup liczb i są wówczas macierzami.
Np. zapis M=[1 2 3
;
6 5 4] spowoduje utworzenie macierzy o 2 wierszach i 3 kolumnach. Powołanie zmiennej tekstowej Z zawierającej literę T wymaga zapisu Z=’T’. W podobny sposób tworzy się zmienne tekstowe zawierające więcej niż jeden znak np. W=’TAK’. Wówczas zostanie utworzony trzy elementowy wektor W a zmienna W będzie typu char.Instrukcja input
Powołanie w programie zmiennej liczbowej (macierzy 1x1) np. L i nadanie jej wartości liczbowej wpisywanej z klawiatury może być zrealizowane instrukcją input np.:
L= input(’Wprowadz L= ’)
Wpisywaną liczbę należy zaakceptować naciskając Enter.
Powołanie w programie wektora WL zawierającego N liczb (macierzy 1x N) wpisywanych z klawiatury może być zrealizowane również instrukcją input np.:
WL= input(’Wprowadz wektor […] WL= ’)
W przypadku definiowania wektora liczb właściwą ilość liczby należy wpisać w nawiasach klamrowych oddzielając kolejne liczby przecinkami lub spacjami. W przypadku macierzy wielowierszowej wiersze należy rozdzielać średnikiem ( ; ). Powołanie w programie zmiennej tekstowej np. Z (macierzy 1x1) i nadanie jej wartości kodu ASCII litery (np. T lub t) może być też zrealizowane instrukcją input o poniższej strukturze np.:
Z = input(’Wprowadz L=’,’s’)
W powyższym zapisie znak ‘s’ oznacza słowo string (ang. ciąg znaków).
Zmienną tekstową zawierającą więcej znaków (np. n) można utworzyć identycznie jak zmienną zawierającą jeden znak, ale w pamięci jest to macierz wierszowa Z[1x n] o liczbie elementów n równej ilości znaków tekstu.
Instrukcja disp i sprintf
Wartości zmiennych np. x i/lub tekstów można wyświetlać instrukcją disp np.:
disp('Wartosc x = '), disp(x)
Jeśli zmienna x zawiera wartość 123.456 to każda użyta w powyższym zapisie instrukcja disp wyświetla swój wynik w kolejnym wierszu jak niżej:
Wartosc x = 123.4560
Aby wyświetlić wynik w jednym wierszu należy utworzyć wektor tekstowy. Wektor tekstowy […] musi łączyć opis zmiennej (np. Wartosc x=) i jej wartość np. x=12.34557. Jednak ponieważ wartość liczbowa jest numeryczna i wymaga ona konwersji na tekst funkcja Matlaba num2 str (ang. numeric to string). Wektor ten można wyświetlić instrukcją disp np.:
disp( ['Wartosc x =', num2str(x) ] )
Wygodną instrukcją do wyświetlania wyników jest sprintf. np. definiujemy zmienną x i wyświetlimy jej wartość:
x =12.34567;
T= sprintf( 'Wartosc x = %4.3f', x ); disp(T);
Wówczas wyświetlony wynik będzie jak niżej:
Wartosc x = 12.346
8
3. STEROWANIE PRZEBIEGIEM OBLICZEŃ W PROGRAMACH Instrukcja sterująca if…elseif….else… end
W programie instrukcje wykonywane są sekwencyjnie tzn. jedna po drugiej. Kolejność wykonywania może być zmieniona przez instrukcję sterującą if. Ta konstrukcja języka nazywana jest też instrukcją warunkową lub wyboru. Na rys. 4.1 przedstawiono schemat prostej instrukcji sterującej, jej strukturę programowa i przykład.
Powoduje ona, że pewna część programu ma być wykonana tylko wtedy, gdy spełniony jest (bądź niespełniony ) określony warunek. Wykonanie instrukcji rozpoczyna się od wyznaczenia wartości logicznej wyrażenia, które jest określone jako warunek w1.
Rys. 4.1. Prosta instrukcja sterująca if
W warunkach logicznych stosowane są operatory logiczne:
- > -większy np.. L>0, - >= - większy równy np. L>=0, - == - równy np. L==99 - <= - mniejszy równy L<= P - ~= - różny np. L ~=0
Wyrażania mogą składać się z wielu członów logicznych połączonych operatorami sumy logicznej (II ) lub iloczynu (&&) logicznego np.:
- ( L>= -5 && L<=5 ) – określa czy liczba L jest z przedziału [-5, 5], - ~ ( L>= -5 && L<=5 ) – określa czy liczba L jest spoza przedziału [-5, 5],
- (Znak==’T’ II Znak == ‘t’) – określa czy zmienna Znak zawiera literę t (mała lub duża)
Rys. 4.2 przedstawia schemat wyboru alternatywy w instrukcji sterującej, jej strukturę programową i przykład.
Natomiast na rys. 4.3 przedstawiono schemat złożonej instrukcji sterującej, jej strukturę programowa i przykład.
Rys. 4. 2. Prosta instrukcja sterująca if - wybór alternatywy
W szczególnej sytuacji blok może zawierać tylko pojedynczą instrukcję. Każdy warunek W w instrukcjach if jest wyrażeniem logicznym i zwraca wartość logiczną –jeśli wartość będzie prawda (true) to instrukcje w bloku
Zapis w Matlabie:
if (W1) Instrukcje 1 end
gdzie:
W1-warunek W1
Instrukcje lub blok instr.
T
N Zapis w Matlabie:
…
L=input(‘Podaj Liczbe L=’) if (L> 0)
disp(‘ L=’) disp(L)
disp(‘ jest dodatnia)’
end
…
Zapis programowy w Matlabie:
If (W)
Instrukcje 1 else
Instrulcje 2 end gdzie:
w-warunek
Zapis w Matlabie:
…
L=input(‘Podaj Liczbe L= ’) If (L> 0)
disp(‘Liczba L> 0)’
else
disp(‘Liczba L nie jest dodatnia’);
end
… W
Instrukcje Lub blok instrukcji
T N
Instrukcje Lub blok instrukcji
Inny zapis w Matlabie:
…
L=input(‘Podaj L=’) if (L> 0)
T=[‘ L=’, num2str(L), ‘ jest dodatnia’];
disp(T) end
…
9
zostaną wykonane a jeśli warunek ma wartość false to instrukcje są pomijane. W przykładach instrukcji dla lepszej przejrzystości warunki logiczne zapisane zostały w nawiasach, ale nie jest to obligatoryjne.
Rys. 4.3. Złożona instrukcja sterująca if
W blokach opisanych jako instrukcje 1, instrukcje 2 albo instrukcje 3, mogą znajdować się zarówno instrukcje proste, jak i strukturalne, w szczególności inne instrukcje warunkowe. W takim przypadku mówimy, że instrukcje warunkowe są zagnieżdżone- patrz zapis w programie tabela 4.1.
Tabela 4.1 Zapis zagnieżdżonych instrukcji sterujących w programie wyznaczania pierwiastków równania kwadratowego
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
% Skrypt oblicza pierwiastki równania kwadratowego
% Wejście: a,b,c - wprowadzane z klawiatury współczynniki RK
% Wyjście: Wyniki są wyświetlane w oknie Command Window clc; clear; format compact;
a=input('Podaj a=');
b=input('Podaj b=');
c=input('Podaj c=');
% <========= M-ce na ewent. wstawienie wykresu i prezentacje rozwiązania graficznego ============
if a~= 0 % teraz obliczenia delta=b*b-4*a*c;
if delta>0
x1=(-b-sqrt(delta))/(2*a);
x2=(-b+sqrt(delta))/(2*a);
disp( ' x1='); disp(x1);
disp( 'x2=' ); disp(x2);
% lub inny sposób wyświetlania wyników disp([ 'x1= ', num2str(x1)]);
disp([ 'x1= ', num2str(x1)]);
elseif delta==0
Wynik=[ 'P1= P2= ', num2str( -b/(2*a)) ];
disp(Wynik) else
disp('Brak pierw. rzeczywistych');
end else
disp('Jest a=0 - to nie rownanie kwadratowe ! ');
disp(' Może być: liniowe, sprzeczne lub tożsamościowe');
end
Zapis programowy w Matlabie:
if (W1) Instrukcje 1 elseif (W2) Instrulcje 2 else
Instrukcje 3 end
gdzie:
w1, w2-warunki
Zapis w Matlabie:
…
L=input(‘Podaj Liczbe L=’) if (L> 0)
disp(‘Liczba L> 0)’
elseif (L==0) disp(‘Liczba=0’) else
disp(‘Liczba ujemna’) end
… W1
T
N
Instrukcje 1
W2 T
N
Instrukcje 2
Instrukcje 3
Wprowadzenie współczynników RK : a, b, c
Obliczenia
pierwiastków lub komunikat o ich braku
Wprowadzono a=0
Komunikat
10
Zadania do samodzielnego wykonania:
Zadanie 4.1
Narysuj algorytm i napisz program rozwiązywania równania kwadratowego dla wprowadzonych wartości parametrów a, b, c. Użyj tylko prostych instrukcji sterujących.
Zadanie 4.2
Narysuj algorytm i napisz program rozwiązywania równania kwadratowego dla wprowadzonych wartości parametrów a, b, c. Użyj 2 prostych instrukcji sterujących i jednej instrukcji alternatywy.
Zadanie 4.3
Narysuj algorytm i napisz program rozwiązywania równania kwadratowego dla wprowadzonych wartości parametrów a, b, c. Użyj 1 prostej instrukcji sterującej i jednej instrukcji alternatywy. Nie stosuj zagnieżdżania instrukcji.
Zadanie 4.4
Zmodyfikuj program z zadania 4.1 stosując sposób wyprowadzania danych jak w przykładzie na rys. 4.1. Zastosuj również alternatywne rozwiązanie stosując instrukcję sprintf(). Jej opis znajdź w helpie.
Zadanie 4.5
Zmodyfikuj program z zadania 4.2 stosując sposób wyprowadzania danych jak w przykładzie na rys. 4.1. Zastosuj również alternatywne rozwiązanie stosując instrukcję sprintf(). Jej opis znajdź w helpie.
Zadanie 4.6
Zmodyfikuj program z zadania 4.3 stosując sposób wyprowadzania danych jak w przykładzie na rys. 4.1. Zastosuj również alternatywne rozwiązanie stosując instrukcję sprintf(). Jej opis znajdź w helpie.
11
Przykłady zastosowania instrukcji sterujących
Zadanie 4.7
Sformułuj algorytm i zapisz w Matlabie program sprawdzający czy z boków o długościach a, b, c można zbudować trójkąt. Parametry a,b,c są wprowadzane z klawiatury.
Specyfikacja danych:
Dane wejściowe:
a, b, c – zadane długości boków, Wynik
T – zmienna logiczna (np. od nazwy Trójkąt Istnieje) przyjmująca wartości:
T=Tak (True) – jeśli trójkąt istnieje lub T=Nie (False) – jeśli trójkąt nie istnieje Lista kroków
1. Wprowadź: a, b, c
2. Zmiennej T przypisz wartość początkową False 3. Jeśli a+b >c oraz a+c >b oraz c+b >a to T=True 4. Jeśli T=False to pisz: Trójkąt nie istnieje 5. Jeśli T=True to pisz: Trójkąt istnieje 6. Koniec
Schemat blokowy
Rys. 4.4. Schemat blokowy algorytmu zadania N
T
Koniec Początek
T =False ( lub T=0 )
a+b >c T
T b+c >a
c+a >b
T =True (lub T=1)
T=True
T
Trójkąt istnieje Trójkąt nie istnieje
N N N Wprowadź: a, b, c
Sprawdź dla danych (a, b, c ) np:
W1 – (12, 4, 8) W2 – (12,10, 8) W3 –(12, 5, 6)
Tabela 4.1. Program w Matlabie 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
clc; clear; close all
disp('Algorytm sprawdza istnienie trójkąta’);
disp('o bokach a, b, c') ; a = input('Podaj bok a: ');
b = input('Podaj bok b: ');
c = input('Podaj bok c: ');
T = false;
if (a+b) > c if (b+c) > a if (c+a) > b T = true;
end;
end;
end;
if T == true
disp('Trójkąt istnieje');
else
disp('Trójkąt nie istnieje');
end;
Rys. 4.2. Program w Matlabie
12
Zadanie 4.8
Sformułuj algorytm sprawdzający czy z boków o długościach a, b, c można zbudować trójkąt.
Użyj zmiennych i operacji logicznych.
Specyfikacja danych:
Dane wejściowe:
a, b, c – zadane długości boków (zmienne liczbowe, liczby dodatnie), Zmienne pomocnicze (robocze)
A, B, C – zmienne logiczne przyjmujące wartości 0 lub 1
np. C=1 (True) jeśli jest prawdziwa relacja a+b>c a jeśli nieprawdziwa to C=0 (False).
Wynik
T – zmienna logiczna (np. od nazwy Trójkąt ) przyjmująca wartości:
T=Tak (True) – jeśli trójkąt istnieje lub T=Nie (False) – jeśli trójkąt nie istnieje
Rys. 4.5. Schemat blokowy algorytmu
Tabela 4.2. Program w Matlabie 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15
clc; clear; close all
disp('Algorytm sprawdza istnienie trójkąta );
disp('o bokach a, b, c') ; a = input('Podaj bok a: ');
b = input('Podaj bok b: ');
c = input('Podaj bok c: ');
C= a+b > c % A, B,C, T będą wyświetlone A= b+c > a
B= c+a > b T = A&B&C if T == true
disp('Trójkąt istnieje');
else
disp('Trójkąt nie istnieje');
end;
&- symbol iloczynu logicznego AND
| - symbol sumy logicznej OR
Koniec Początek
C = a+b >c A = b+c >a B =c+a >b
T=Tru e
T
Trójkąt istnieje N
T= C & A & B
Trójkąt nie istnieje Wprowadź: a, b,
c
13
Złożone warunki logiczne w instrukcjach sterujących
Wykonanie niektórych instrukcji (lub grup instrukcji) zależy od wartości warunków logicznych. Warunki logiczne mogą być proste (np. x>0) lub mogą być wyrażeniami logicznymi (np. L>0 && mod(L,2)==0 && (L>= 10 && L<100)), w których wykorzystywane są operatory iloczynu (&&) lub alternatywy (||). W poniższych przykładach zadań pokazano przykłady wykorzystania warunków logicznych w rozwiazywaniu różnych problemów.
Zadanie 4.9
Napisz skrypt sprawdzający czy wprowadzona liczba L jest dodatnia i całkowita
Rozwiązanie 1 Rozwiązanie 2
clc; clear; close all;
format compact;
L=input('Podaj liczbę L= ');
if L>0 && mod(L, 1)==0
disp('Liczba spełnia warunki');
else
disp('liczba nie spełnia warunków');
end
clc; clear; close all;
format compact;
L=input('Podaj liczbę L= ');
if L>0 && round(L) - L==0 disp('Liczba spełnia warunki');
else
disp('liczba nie spełnia warunków');
end
Zadanie 4.10
Napisz skrypt sprawdzający czy wprowadzona liczba L jest dodatnia, parzysta i 2 cyfrowa.
Rozwiązanie clc; clear; close all;
format compact;
L=input('Podaj liczbe L= ');
if L>0 && mod(L,2)==0 && (L>= 10 && L<100) disp('Liczba spełnia warunki');
else
disp('liczba nie spelnia warunkow');
end
Zadanie 4.11
Napisz skrypt sprawdzający czy wprowadzony znak jest literą T lub t.
Rozwiązanie clc; clear; close all;
format compact
Z=input('Podaj znak Z= ', 's');
if Z=='T' || Z=='t'
disp(' Znak jest właściwy') else
disp(' To nie jest dobry znak') end
14
4. PĘTLE for i while W PROGRAMOWANIU
W języku Matlab występują dwie pętle: for i while. Pętle służą do wielokrotnego powtarzania pewnych identycznych czynności. Instrukcja for (rys. 5.1) powoduje wykonanie bloku instrukcji tyle razy, ile wartości znajduje się w przedziale wyznaczonym przez wartości początkową P i końcową K zmiennej sterującej s. Liczba tych wartości zależy od wartości krok. Jeśli krok nie jest podany to domyślnie jest przyjęte ze krok=1. Pętla for wykonuje się znaną, i z góry określoną liczbę razy. Każdorazowo wartość zmiennej sterującej zmienia się wg zależności:
s=s+krok.
Rys. 5.1. Schemat pętli for i jej zapis w Matlabie
Czasami, zapisana w programie pętla for może nie zostać zrealizowana, ( nie spełniony jest warunek np. dla pętli for i=1:1:0 widać, ze Wk <Wp). Wtedy blok instrukcji przeznaczony do powtórzeń nie będzie wykonany nawet raz. Pętla for jest elastyczna. Zmienna sterująca może być typu całkowitego lub niecałkowitego. Jej wartości mogą zmieniać się o dowolny krok (np. 0.1). W przypadku gdy zmienna sterująca ma zmieniać się co 1, w definicji pętli for można pominąć jeden dwukropek i wyrażenie krok. Jeżeli potrzebna jest pętla zliczająca w dół, tzn. wartość początkowa jest większa od końcowej, to trzeba nadać ujemną wartość stałej krok.
W przypadkach, gdy liczba powtórzeń pętli nie jest z góry znana, wygodnie jest stosować pętlę while. Realizacja tej pętli jest zależna od spełnienia postawionego na początku warunku kontynuacji. Wykonanie „bloku powtarzanych instrukcji" jest powtarzane dopóki jest spełniony jest warunek. Jednocześnie jedna z instrukcji bloku musi mieć wpływ na wartość warunku, gdyż w innym przypadku pętla nie mogłaby się skończyć. Postać warunku jest taka sama, jak w instrukcji if. W pętli while rys. 5.2 najpierw jest sprawdzany warunek.
Rys. 5.2. Schemat pętli while i jej zapis w Matlabie
Konstrukcja for w Matlabie:
for s=P : krok: K
Blok powtarzalnych instrukcji;
end gdzie:
s- zmienna sterująca pętli P- wartość początkowa K- wartość końcowa krok- wartość zmian s Nadanie wartości początkowej
zmiennej sterującej s
Warunek kontynuacji
obliczeń
Zmiana wartości zmiennej sterując
ej Blok powtarzalnych
Instrukcji T
N
…
while (warunek)
Instrukcje;
end
Przykład:
Sumowanie N kolejnych liczb dodatnich
… N=input(‘Podaj liczbe calk. N= ’) Suma=0;
for j=1: 1: N Suma=Suma+j;
end
disp(‘Wynik=’);
disp(Suma)
Przykład:
Sumowanie N kolejnych liczb dodatnich
… N=input(‘Podaj liczbe calk. N= ’) Suma=0;
j=1;
while (j <=N) Suma=Suma+j;
j=j+1;
end
disp(‘Wynik=’);
disp(Suma) Blok powtarzalnych
Instrukcji
Warunek kontynuacji
obliczeń
T
N Nadanie wartości początkowych
zmiennych
15
Wyrażenie warunek jest typu logicznego (podobnie jak w instrukcji if) i może przyjmować tylko wartości: true lub false. Jeżeli warunek jest prawdziwy (spełniony), pętla się wykona, w przeciwnym wypadku następuje wyjście z pętli. Jeśli przed rozpoczęciem iteracji (powtórzeń) pętli warunek nie jest spełniony, to blok instrukcji nie zostanie wykonany ani jeden raz, a realizacja pętli while zostanie zakończona. Wystąpienie gdziekolwiek w pętli instrukcji break powoduje natychmiastowe zakończenie pętli, a program realizuje się dalej (poza pętlą). Przykładowe zastosowanie pętli while to wystawianie rachunku przez kasjerkę. Tu liczba produktów w zapełnionym koszyku nie jest znana. Algorytm wystawienia rachunku polega na wielokrotnym dodawaniu ceny kolejnego towaru do aktualnej sumy już zsumowanych cen zakupów. Czynnością początkową jest zerowanie rachunku klienta w kasie fiskalnej.
Algorytm tworzenia rachunku można zapisać jak poniżej:
1 Rachunek=0 (uruchom kasę)
2 Warunek: Dopóki koszyk nie jest pusty wykonuj:
-pobierz kolejny produkt z koszyka i odczytaj jego cenę, - aktualizuj rachunek wykonując działanie:
Rachunek=Rachunek +cena kolejnego produktu
(powyższy zapis należy rozumieć że: nowy rachunek = stary rachunek + cena kolejnego produktu) 3. Wystaw paragon do zapłaty
Pokazana tu czynność 2 może być realizowana wielokrotnie i a’priori nie wiadomo ile razy.
Jest to typowe dla pętli typu while. Tu zdanie w punkcie 2 można zapisać: while ( koszyk nie pusty).
Każda pętla wykonywana jest pewną liczbę razy. Tu o zakończeniu pętli decyduje opróżnienie koszyka.
Zadanie 5.1
Przedstawić algorytm i napisać program obliczający wektor n=12 wartości zmiennej x oraz funkcji f(x) = a*x^2 +b*x + c. Do obliczeń przyjąć, że zmienna x przyjmuje wartości z przedziału [-10, 10]. Obliczane wartości zapamiętać w wektorach wierszowych Wx i Wf i na tej podstawie wykonać wykres funkcji f(x).
W programie zapewnić wczytywanie współczynników a, b, c z klawiatury.
Specyfikacja danych:
Dane wejściowe:
a,b,c- współczynniki funkcji f(x) = a*x^2 +b*x + c wczytywane z klawiatury L, P- wartość najmniejsza (Lewa) i największa (Prawa) zmiennej niezależnej x n- założona liczba punktów wykresu.
Zmienne robocze:
krok- różnica wartości dla każdej pary kolejnych wartości zmiennej niezależnej xn - xn-1,
j- zmienna oznaczająca numer wartości zmiennej x (indeks).
Dane wyjściowe (wynikowe):
Wx(1: n)- n-elementowy wektor wartości zmiennej niezależnej x, Wf(1: n)- n-elementowy wektor wartości funkcji f(x).
Dalej na rys. 3 przedstawiono schemat blokowy algorytmu rozwiązania zadania. Natomiast w tabeli 5.1 przedstawiono instrukcje programu w Matlabie a na rys. 5.6 pokazano okno edytora programu.
W rozwiązaniu przedstawianego programu zastosowano pętlę for.
W tabeli 5.1 w wierszach 1-16 przedstawiono program tablicowania funkcji i wykonania jej wykresu. Na końcu programu (wiersze18-21) dodano instrukcje opisujące wykres a w wierszach 22-25 dodano instrukcje wyświetlania wektorów Wx i Wf.
W tabeli 5.2 przedstawiono inne sposoby zapisu pętli for. Pokazano też alternatywny zapis wektorowy tablicowania funkcji. Takie rozwiązanie występuję tylko w Matlabie a jego cechą jest:
- prostota zapisu,
- ogromna szybkość wykonywania.
W tabeli 5.3 przedstawiono inne zapisy pętli tablicowania funkcji wykorzystującej instrukcję while.
16 Rys. 5.3. Schemat blokowy tablicowania funkcji
Tabela 5.1. Program tablicowania funkcji w Matlabie 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
%---Początek programu---
% Tablicowanie funkcji f(x)= a*x^2 +b*x + c clc; clear; close all;
format compact; format short;
a=input('Podaj a = ');
b=input('Podaj b = ');
c=input('Podaj c = ');
L=-10; P=10; n=50; % zadawane parametry stałe krok=(P-L)/(n-1);
j=1;
for x=L: krok: P
Wx(j)=x; %wartosci zmiennej x
Wf(j)=a*x^2 +b*x+c; %wartosci funkcji dla zmiennej x j=j+1; %j- numer kolejnej wartości x i f(x) end
plot(Wx, Wf, '*-'); % wykres f(x)
% poniżej podstawowe opisy uzupełniające wykres xlabel('\bf zmienna niezalezna x')
ylabel('\bf f(x)= a*x^2 +b*x+c')
title('\bf \it Wykres f(x)= a*x^2 +b*x+c', 'FontSize' , 16 ) legend( 'f(x)' )
disp('Zawartości wektorów Wx i Wf:');
TWx= sprintf('%7.2f ',Wx); % Utworzenie wektora TWx do wydruku zawatrosci Wx disp( TWx); % wydruk wektora TWx
TWf= sprintf('%7.2f ',Wf);
disp(TWf);
Czyść zmienne, ekran, zamknij okna wykresów.
Wprowadź współczynniki równania: a, b, c
Utwórz zmienne i nadaj im wartości:
L=-10; P=10; n=12; krok=(P-L)/(n-1)
Wykonaj wykres funkcji : f(x)=a*x^2 +b*x +c poleceniem : plot(Wx, Wf)
Początek
Zapis programowy pętli w Matlabie:
j=1;
for x=L: krok: P Wx(j)=x;
Wf(j)=a*x^2+ b*x+ c;
j=j + 1;
end
Koniec x<P
Wx(j)=x Wf(j)=a*x^2+b*x+ c
j=j+1 x=x+ krok T
N
x=L, j=1
Wykonanie i opis wykresu Tablicowanie
funkcji Wprowadzenie danych i wartości
ustalonych
17
W programie przedstawionym w tabeli 3 następujące wiersze zawierają:
-1-2 komentarze
- 3-15 instrukcje realizujące zadanie tablicowania z wykorzystaniem pętli for, - 16 instrukcję wykonującą wykres,
- 18-21 instrukcje opisujące wykres
-22-26 to wyświetlające w oknie Command Window zawartości wektorów Wx i Wf.
Tabela 5.2 Warianty pętli for i obliczeń wektoryzowanych for- wersja 1
(patrz w tab. 1) for- wersja 2 for-wersja 3 Obliczenia
wektoryzowane j=1;
for x=L: krok: P Wx(j)=x;
Wf(j)=a*x^2+ b*x+ c;
j=j+11;
end
x=L;
for j=1: 1 : n Wx(j)=x;
Wf(j)=a*x^2+ b*x +c;
x=x+ krok;
end
for j=1: 1 : n x= L+(j-1)*krok;
Wf(j)=a*x^2+ b*x +c;
x=x+ krok;
end
x= L: krok: P Wx=x;
Wf=a*x.^2 +b*x +c
Tabela 5.3 Warianty pętli while i obliczeń
while- wersja 1 while - wersja 2 while – wersja 3 x=L;
while x <= P Wx(j)=x;
Wf(j)=a*x^2+ b*x+c;
x=x+krok;
j=j+1;
end
j=1; x=L;
while j <= n Wx(j)=x;
Wf(j)=a*x^2+ b*x+c;
x=x+krok;
j=j+1;
end
j=1;
while j <=1 x= L+(j-1)*krok;
Wx(j)=x;
Wf(j)=a*x^2+ b*x+c;
j=j+1;
end
Opis działania programu tablicowania funkcji przedstawionego w tabeli 5.1:
Instrukcje w wierszu 4 i 5 oznaczają:
clc - polecenie czyszczenia ekranu wyników (okno Command) clear - usuwanie wszystkich zmiennych z pamięci roboczej Matlaba close all – zamknięcie wszystkich wykresów (jeśli były)
format compact – pisanie w oknie Command Windows bez wstawiania pustych wierszy format short- wyświetlanie liczb z dokładnością 4 miejsc po przecinku
Instrukcje w wierszu 5,6 i 7 :
Tworzą one w pamięci Matlaba (patrz okno Workspace) zmienne a,b i c . Wartości tych zmiennych są nadawane z klawiatury.
Wartości a,b, c to zmienne wejściowe.
Instrukcje w wierszu 8 :
W tym wierszu są trzy instrukcje podstawienia. Tworzą one w przestrzeni roboczej Matlaba zmienne L,P o n.
Ich znaczenie fizyczne przedstawiono w opisie danych.
Instrukcja w wierszu 9 :
Instrukcja oblicza wartość kroku krok=(P-L)/(n-1) zmian zmiennej x.
W wierszach 11- 15 zapisano pętlę for. Zaznaczono ją elipsą wskazującą zakres powtarzalnych instrukcji.
W petli for zawsze możemy określić ile razy będzie ona powtarzana. W tym przykładzie będzie to dokładnie n razy.
Jest tak, bo pętla (wiersz 11 zmienia x z krokiem zależnym do n.
Wartość zmiennej krok jest wykorzystywana do zmiany kolejnych wartości zmiennej x w pętli for (początek wiersz 11) Pierwszą wartością zmiennej x jest: x=L
Kolejna to: x=x+krok (inaczej L+krok) Następna: x=x+krok (inaczej L+2*krok)
………itp.
Ostatnia to: x=P
18
W pętli do wskazywania miejsca pamiętania wyników obliczeń w wektorach Wx(1:n) i Wf(1:n) będzie wykorzystana zmienna indeksowa j. Jest ona inicjowana przed pętlą (wiersz 10) i otrzymuje wartość j=1;
W wierszu 11 tworzone są kolejne wartości zmiennej x zaczynając od wartości x=P.
W kolejnym kroku wartość zmiennej x zwiększa się o wartość kroku. Czynności te powtarzają się aż do osiągniecia przez zmienną x wartości górnej tzn. x=P.
Każda tworzona wartość zmiennej x jest zapamiętywana w j-tej komórce pamięci wektora Wx(j) - wiersz12.
Dla każdej wartości x w wierszu 13 obliczana jest wartość funkcji f(x) i zapamiętywana w j-tej pozycji wektora Wf(j).
Po każdym wykonaniu pętli wartość zmienne j wzrasta 1 (wiersz 14- j=j+1).
Zapis j=j+1 należy interpretować następująco:
nowa wartość j (w zapisie czerwona z lewej strony) będzie poprzednią wartością zwiększoną o 1 (czyli prawą stronę zapisu).
Wiersz 15 to koniec pętli for.
Wiersz 16 to polecenie plot dotycząca wykonania wykresu.
Wektory zmiennej niezależnej (tu Wx) i wartości funkcji (tu Wf) muszą mieć ten sam wymiar (tu jest to n=12).
Trzecim parametrem funkcji plot jest string (ciąg znaków) ' *-' . Są one opcjonalne i dotyczą sposobu oznaczenia serii danych na wykresie. Wykorzystane w przykładzie symbole podane oznaczają:
* - punkty (x, f(x) ) mają zostać oznaczone na wykresie symbolem *, - - punkty należy połączyć linią ciągłą,
r- wykres wykonać w kolorze czerwonym.
Zrozumienie opisanego działania pętli for ułatwi przykład pokazujący wynik działania pętli tablicowania dla parametrów:
a=2, b=7, c=1, L=-10, P=10, n=12
Dla powyższych danych wartość kroku wyniosła: krok = 1.8182
Stąd zawartość wektorów Wx i Wf będzie taka jak przedstawiono poniżej w tabeli 5.4:
Tabela 5.4. Wyniki obliczeń zawartości wektorów Wx i Wf w programie z tabeli 1
j 1 2 3 4 5 6 7 8 9 10 11 n=12
Wx(j) -10.00 -8.18 -6.36 -4.55 -2.73 -0.91 0.91 2.73 4.55 6.36 8.18 10.00
Wf(j) 131.00 77.61 37.45 10.50 -3.21 -3.71 9.02 34.97 74.14 126.54 192.16 271.00
Na podstawie obliczonych wektorów Wx i Wf instrukcja plot(Wx, Wf, '*-') programu wykonuje wykres widoczny na rys. 5.4.
Wykres zostaje dodatkowo opisany przez polecenia w liniach 16-21 (opisy osi, tytuł i legenda).
Rys. 5.4. Wykres przebiegu funkcji f(x) dla parametrów : a=2, b=7, c=1, L=-10, P=10, n=12
Wiersze 18-21 opisują dokładniej rysunek 1. Wiersz 18 powoduje umieszczenie pogrubionego( (\bf) – bold font ) tekstu opisu osi x.
Wiersz 19 powoduje umieszczenie pogrubionego( (\bf) – bold font ) tekstu opisu osi y.
Wiersz 20 wykonuje tytuł (\bf- pogrubiony , \it- italic czyli pochylony. Instrukcja nadaje tytułowi nowy atrybut wielkości czcionki (FontSize) równy 14 punktów.
19
Końcowe instrukcje (wiersze 22-26) wyświetlają z dokładnością do 3 miejsc (format np. %7.3f ) zawartości wektorów Wx i Wf w oknie Command Window.
Na rys. 5.5 przedstawiono okna starszego środowiska obliczeniowego Matlab wersja R2011a z wynikami obliczeń programu z tab. 5.1. Wyniki są zawarte w podstawowych oknach charakterystyczne dla każdej wersji środowiska Matlaba:
- Command Window - Workspace - Command History.
W oknie Command Window widoczne są:
- instrukcje wejścia i efekt wprowadzania danych do programu
- zawartość obliczonych w pętli for ( patrz instrukcje 10-15 tabela 5.1) wektorów Wx i Wf.
W oknie Workspace pokazane są nazwy zmiennych wykorzystywanych w programie, ich typy rozmiary.
W oknie Command History są wyświetlane wprowadzane polecenia lub dane. Pozwala to na szybkie ponowne ich wykorzystanie.
Rys. 5.5. Okna środowiska Matlab wersja R2011a
Na rys. 5.6 przedstawiono okno Edytora z programem. Do uruchamiania i śledzenia programu (np. przy jego wykonywaniu instrukcja po instrukcji służy menu zakładki Debug.
Rys. 5.6. Okno edytora programu w środowisku Matlab.
20
Zadanie 5.2
Napisać program obliczający wektor n=50 wartości zmiennej x oraz funkcji f(x) = a*x^2 +b*x + c dla x z przedziału [-10, 10]. Obliczane wartości zapamiętać w wektorach wierszowych.
Współczynniki a, b, c są wczytywane z klawiatury. Zapewnij możliwość wielokrotnego powtarzania obliczeń.
Wskazówka:
Do powtarzania obliczeń wykorzystać i nieskończoną pętlę while przerywaną instrukcją break.
Do uruchomienia przerywania wykorzystać przycisków graficznych menu Program zadania 5.2 pokazano w tab. 5.4.
Tab. 5.4. Program tablicowania funkcji z powtarzaniem jej wykonania 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
%---Początek programu--- while (1 ) % petla nieskonczona
%=========-Początek pętli while========================
% Tablicowanie funkcji f(x).
% Tablicowanie funkcji f(x)= a*x^2 +b*x + c clc; clear; close all;
format compact; format short;
a=input('Podaj a = ');
b=input('Podaj b = ');
c=input('Podaj c = ');
L=-10; P=10; n=50; % zadawane parametry stałe krok=(P-L)/(n-1);
j=1;
for x=L: krok: P Wx(j)=x;
Wf(j)=a*x^2 +b*x+c;
j=j+1 end
plot(Wx, Wy, '*-');
%---Koniec tablicowania --- P= menu('Czy zakonczyc obliczenia?, 'TAK ', 'NIE');
if P==1 break;
end
end %==============Koniec petli while================
Tablicowanie funkcji
Sprawdzanie warunków zakończenia
programu
Wprowadzenie danych i wartości
ustalonych
21
Zadania do samodzielnego wykonania:
W zadaniach tablicowania przyjmuj liczbę punktów (np. n=10) tak by można było zawartości wektorów przejrzyście wyświetlać w oknie Command.
Zadanie 5.3
Przedstaw wykres funkcji f(x)=2x^2+7x+1 w zakresie x z przedziału [ - 8, 6] . Do tablicowania wykorzystaj wektoryzację.
Pokaż graficzne rozwiązanie równania.
Wskazówka: Do wykresu dodaj prostą f(x)=0.
Zadanie 5.4
Przedstaw wykres funkcji f(x)=2x^2+7x+1 w zakresie x z przedziału [ - 8, 6] . Do tablicowania wykorzystaj pętlę for. Dodaj polecenia opisujące wykres.
Pokaż graficzne rozwiązanie równania.
Wskazówka: Do wykresu dodaj prostą f(x)=0.
Zadanie 5.5
Przedstaw wykres funkcji f(x)=2x^2+7x+1 w zakresie x z przedziału [ - 8, 6] . Do tablicowania wykorzystaj pętlę while. Dodaj polecenia opisujące wykres.
Pokaż graficzne rozwiązanie równania.
Wskazówka: Do wykresu dodaj prostą f(x)=0.
Zadanie 5.6
Korzystając z polecenia ezplot przedstaw na jednym rysunku wykres funkcji f1(x)=2x^2+7x+1 oraz funkcji f2(x)=2x^2+7x-1. Dodaj legendę.
Wskazówka: skorzystaj z polecenia hold.
Zadanie 5.7
Korzystając z jednej pętli for wykonaj tablicowanie funkcji f1(x)=2x^2+7x+1 oraz funkcji f2(x)=2x^2+7x-1.
Wykonaj wykres i dodaj legendę.
Wskazówka: skorzystaj z polecenia hold.
Zadanie 5.8
Wykonaj wykres koła o zadanym promieniu r. Do wykonania wykorzystaj równanie koła we współrzędnych biegunowych.
X= r*sin(k) dla k=1,2.3,…360 Y=r*cos(k)