Zajęcia 1

Zaawansowane metody numeryczne

1. Optimization Toolbox

Do rozwiązywania zagadnień optymalizacyjnych w MATLAB-ie służy toolbox optymalizacyjny - Optimization Toolbox.

Toolbox zawiera rozwiązania dla zagadnień:

Ustawienie dodatkowych parametrów procesu optymalizacji

Do ustawiania dodatkowych parametrów służy parametr options, który może kontrolować proces obliczeniowy. Wartość options ustawia się przed obliczeniami za pomocą funkcji optimset.

Aby zmienić ustawienia należy wywołać:

`options=optimset('ParameterName1',Value1, 'ParameterName2', Value2)`

gdzie:
ParameterName1 - nazwa opcji
Value1 - wartość opcji

Wywołanie optimset bez argumentów powoduje wyświetlenie listy ze wszystkimi dostępnymi parametrami i wartościami, które mogą przyjąć.
Wywołanie funkcji w postaci optimset('fminbind') wyświetli parametry i wartości dla funkcji fminbind.

Poniżej podane zostały najczęściej używane parametry:

Parameter Wartość Opis
MaxFunEvals liczba całkowita dodatnia Maksymalna dozwolona liczba obliczeń wartości funkcji
ToolFun liczba dodatnia Dokładność wykonywania obliczeń funkcji
TolX liczba dodatnia Dokładność wykonywania obliczeń argumentu X
MaxIter liczba całkowita dodatnia Maksymalna dozwolona liczba iteracji
Display iter
final
notify
off
wyświetlanie wyników po każdej iteracji
wyświetlanie ostatecznego rozwiązania
wyświetlanie wyników w koniecznym przypadku
bez wyświetlania wyników
FunValCheck off, on Sprawdza czy wyniki funkcji celu są poprawne.
On - wyświetla błędy gdy funkcja celu zwraca wartości złożone lub NaN
Off - nie wyświetla błędów.

Niewymienione składowe zachowują wartości domyślne. Tak samo podstawienie [ ] powoduje przyjęcie domyślnej wartości dla parametru.

Wybrane funkcje biblioteki Optimization Toolbox

Miejsca zerowe - funkcja fzero

Funkcja fzero wyznacza miejsca zerowe dowolnej funkcji nieliniowej.

Ogólna forma funkcji:
x = fzero(fun, x0)
x = fzero(fun, x0, options)
x = fzero(problem)
[ x, fval, exitflag, output] = fzero(...)

Argumenty wejściowe:

fun wyrażenie tekstowe zawierające nazwę funkcji
x0 punkt startowy wokół którego szukane jest rozwiązanie
options zmienna w postaci struktury z zapisanymi informacjami o procesie rozwiązywania zadania optymalizacji
problem zdefiniowany problem (Matlab Problem Structure)

Argumenty wyjściowe:

x miejsce zerowe
fval wartość funkcji celu w punkcie minimum
exitflag informacja obliczeniowa
output informacja o rezultatach optymalizacji

Badana funkcja fun powinna zmieniać znak w miejscu zerowym - musi istnieć przedział, na którego końcach funkcja ma różne znaki i w którym znajduje się rozwiązanie.

Minimum - funkcja fminbnd

Funkcja fminbnd znajduje lokalne minimum funkcji jednej zmiennej.

Ogólna forma funkcji:
x = fminbnd(fun, x1,x2)
x = fminbnd(fun, x1,x2, options)
x = fminbnd(problem)
[ x, fval] = fminbnd(...)
[ x, fval, exitflag] = fminbnd(...)
[ x, fval, exitflag, output] = fminbnd(...)

Argumenty wejściowe:

fun wyrażenie tekstowe zawierające nazwę funkcji celu
x1 dolne ograniczenie na zmienną x
x2 górne ograniczenie na zmienną x
options zmienna w postaci struktury z zapisanymi informacjami o procesie rozwiązywania zadania optymalizacji
problem zdefiniowany problem (Matlab Problem Structure)

Argumenty wyjściowe:

x minimum
fval wartość funkcji celu w punkcie minimum
exitflag informacja obliczeniowa
output informacja o rezultatach optymalizacji

Funkcje Matlab

MATLAB umożliwia tworzenie własnych funkcji. Definicję takiej funkcji należy umieścić w pliku o rozszerzeniu *.m. Należy pamiętać, że nazwa pliku zawierającego funkcję definiowaną samodzielnie musi by taka sama, jak nazwa funkcji. Schemat definicji funkcji wygląda następująco:

function [zmienne wyjściowe] = nazwa_funkcji(parametry wejściowe);  
 % instrukcje do wykonania  
end 

Przykład prostej funkcji:

function wynik = mojaFunkcja(x, y)
wynik = sin(x) + cos(y);  
end  

Po zapisaniu tego kodu w pliku mojaFunkcja.m, korzystamy z tej funkcji wywołując ją z linii komend

res = mojaFunkcja(1, 0)

W plikach *.m umieszcza się zwykle bardzo rozbudowane funkcje. W Matlabie istnieje możliwość definiowania własnej funkcji bezpośrednio w linii komend, bez zapisu do pliku. Nazywamy ją funkcją inline. W praktyce tym sposobem definiuje się funkcje o niewielkim kodzie. Przykład użycia inline:

fun = inline(‘2*x + 5’ , ‘x’)  

tworzy funkcjy f(x) = 2x + 5 i od tego momentu jest ona dostępna:

fun(2)

Równolegle do funkcji inline istnieje możliwość definiowania tzw. funkcji anonimowej. Również jest to wygodne, gdy kod tworzonej funkcji nie jest rozległy i nie chcemy tworzyć m-pliku. Przy definicji funkcji anonimowej używa się znaku @. Przykład użycia funkcji anonimowej:

fun = @(x) x.^5

W nawiasie na pierwszym miejscu od @ umieszczamy zmienną (lub oddzielone przecinkami zmienne) funkcji, dalej znajduje się treść/ciało funkcji. Od tego momentu funkcja jest dostępna:

fun(2)

Zadania

Zadanie 1

Oblicz wartość liczby π, dla zerowej funkcji sin(x), położonej w otoczeniu punktu x0=3.
Odpowiedź: 3.1416

Zadanie 2

Zdefiniuj funkcję:

y = -exp(-x)*log(x)

Narysuj jej wykres w przedziale[0.5, 3] i znajdź punkt zerowy.
Odpowiedź: 1

Zadanie 3

Rozkład temperatury w pewnym układzie opisany jest funkcją:

T(x) = x3 + 2x2 + x

Ustal, w jakim punkcie wartość temperatury jest równa 3.
Odpowiedź: 0.8637

Zadanie 4

Znajdź miejsce zerowe funkcji w otoczeniu punktu x0=2:

f(x) = x3 - 2x - 5

Znajdź pozostałe pierwiastki wielomianu za pomocą funkcji roots.
Odpowiedź: 2.0946, pozostałe pierwiastki: -1.0473 + 1.1359i, -1.0473 - 1.1359i.

Zadanie 5

Dla funkcji f(x) = sin(x) znajdź minimum w przedziale [0, 2π]. Wyświetl wykres oraz informację o kolejnych iteracjach (optimset).
Odpowiedź: 4.7124

Zadanie 6

W przedziale [0, 2] zdefiniuj funkcję :

f(x) = e-x sin3πx
Narysuj wykres funkcji, następnie znajdź punkt x dla którego funkcja osiąga drugie lokalne minimum.
Odpowiedź: 1.1554

Zadanie 7

Zdefiniuj funkcję:

f(x) = sin(cosh(x))
Znajdź miejsce zerowe podanej funkcji, definiując do tego celu strukturę Problem Structure.
Odpowiedź: 1.8115

problem.objective = @(x)sin(cosh(x));
problem.x0 = 1;
problem.solver = 'fzero'; 
problem.options = optimset(@fzero); 
Solve the problem.

x = fzero(problem) 

Zadanie 8

Rozwiąż równanie:

f(x) = sin(x) - e-x
znajdując wszystkie pierwiastki tego równania, które znajdują się w przedziale [0, 50]. Przedstaw funkcję wraz ze znalezionymi pierwiastkami na jednym wykresie.
Odpowiedź:

Zadanie 9

Współczynnik liniowych strat hydraulicznych w układach kanalizacji ciśnieniowej oblicza się ze wzoru Colebrooka-White’a (1) [Colebrook, White 1937; Colebrook 1939]:

1/√f = -2log10(ε/3.7 + 2.51/(Re*/√f ))
gdzie:
ε - współczynnik chropowatości względnej
Re - liczba Reynoldsa

Użyj funkcji fzero do znalezienia pierwiastków równania Colebrook'a dla podanych poniżej kombinacji parametrów:
a) ε = 0, Re = 5000
b) ε = 10-4, Re = 107
Odpowiedź: a) 0.037392727578047 b) 0.012166080958897