Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Podobne dokumenty
Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

d) Definiowanie macierzy z wykorzystaniem funkcji systemu Matlak

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Spis treści. Koszalin 2006 [BADANIA OPERACYJNE PROGRAMOWANIE LINIOWE]

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

maj 2014 Politechnika Gdańska Wydział Oceanotechniki i Okrętownictwa St. II stop., sem. I

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Rozdział 6 PROGRAMOWANIE WYPUKŁE I KWADRATOWE

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Zad. 3: Układ równań liniowych

PODSTAWY AUTOMATYKI. MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Programowanie celowe #1

MATLAB tworzenie własnych funkcji

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Metody Optymalizacji Laboratorium nr 4 Metoda najmniejszych kwadratów

Optymalizacja systemów

Klasy abstrakcyjne i interfejsy

Ekonometria - ćwiczenia 10

OBLICZENIA OPTYMALIZACYJNE W MATLABIE. WEiTI PW

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Egzamin / zaliczenie na ocenę*

Optymalizacja systemów

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

Optymalizacja systemów

Laboratorium Metod Optymalizacji

Zapisywanie algorytmów w języku programowania

ZASTOSOWANIE PROGRAMOWANIA LINIOWEGO W ZAGADNIENIACH WSPOMAGANIA PROCESU PODEJMOWANIA DECYZJI

Notatki do tematu Metody poszukiwania rozwiązań jednokryterialnych problemów decyzyjnych metody dla zagadnień liniowego programowania matematycznego

Laboratorium: sprawdzian MATLAB

Rozdział 1 PROGRAMOWANIE LINIOWE

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

ROZWIĄZYWANIE UKŁADÓW RÓWNAŃ NIELINIOWYCH PRZY POMOCY DODATKU SOLVER PROGRAMU MICROSOFT EXCEL. sin x2 (1)

III TUTORIAL Z METOD OBLICZENIOWYCH

1 Programowanie w matlabie - skrypty i funkcje

Laboratorium nr 5: Mnożenie wektorów i macierzy

doc. dr Beata Pułska-Turyna Zarządzanie B506 mail: mgr Piotr J. Gadecki Zakład Badań Operacyjnych Zarządzania B 505.

Document: Exercise*02*-*manual /11/ :31---page1of8 INSTRUKCJA DO ĆWICZENIA NR 2

Definicja problemu programowania matematycznego

1 Podstawy c++ w pigułce.

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Programowanie liniowe

Podstawy MATLABA, cd.

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Algorytm grupowania danych typu kwantyzacji wektorów

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Zadanie 2: Arytmetyka symboli

Automatyka i Robotyka II Stopień ogólno akademicki studia niestacjonarne wszystkie Katedra Automatyki i Robotyki Prof. dr hab. inż.

Funkcje i Procedury. Wyrazenien

Metody numeryczne. Instytut Sterowania i Systemów Informatycznych Wydział Elektrotechniki, Informatyki i Telekomunikacji Uniwersytet Zielonogórski

AKADEMIA MORSKA W SZCZECINIE WI-ET / IIT / ZTT. Instrukcja do zajęc laboratoryjnych nr 1 AUTOMATYZACJA I ROBOTYZACJA PROCESÓW PRODUKCYJNYCH

4. Funkcje. Przykłady

Matlab Składnia + podstawy programowania

Modelowanie rynków finansowych z wykorzystaniem pakietu R

Wprowadzenie do programu Mathcad 15 cz. 1

Typy, klasy typów, składnie w funkcji

Ćwiczenia laboratoryjne - 7. Problem (diety) mieszanek w hutnictwie programowanie liniowe. Logistyka w Hutnictwie Ćw. L. 7

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Algorytm wstecznej propagacji błędów dla sieci RBF Michał Bereta

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Równania nieliniowe. LABORKA Piotr Ciskowski

Wprowadzenie do Mathcada 1

Ćwiczenie 1. Wprowadzenie do programu Octave

INSTRUKCJA DO ĆWICZENIA NR 4

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Dokumentacja. Kalibracja parametrów modelu Hestona za rozszerzonego filtra Kalmana. Mikołaj Bińkowski Wiktor Gromniak

PODSTAWY AUTOMATYKI. MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.

Rozwiązywanie równań różniczkowych z niezerowymi warunkami początkowymi

INTERPOLACJA I APROKSYMACJA FUNKCJI

Document: Exercise-05-manual /1/ : page 1 of 16. KATEDRA MECHANIKI STOSOWANEJ Wydzia! Mechaniczny POLITECHNIKA LUBELSKA

1 Podstawy c++ w pigułce.

Zad. 5: Układ równań liniowych liczb zespolonych

Ćwiczenia laboratoryjne - 7. Zagadnienie transportowoprodukcyjne. programowanie liniowe

Wstęp do Programowania potok funkcyjny

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Programowanie w języku Python. Grażyna Koba

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

Podstawy Informatyki Computer basics

Temat 5. Programowanie w języku Logo

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Optymalizacja ciągła

Metody systemowe i decyzyjne w informatyce

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania. Podstawy Automatyki

Układ równań liniowych

Układy równań liniowych

Rozdział 2 PROGRAMOWANIE LINIOWE CAŁKOWITOLICZBOWE

Zapisywanie w wybranej notacji algorytmów z warunkami i iteracyjnych

Optymalizacja ciągła

SIECI KOMPUTEROWE I TECHNOLOGIE INTERNETOWE

Zadanie nr 2: Arytmetyka liczb zespolonych

WŁAŚCIWOŚCI PROGRAMOWEJ REALIZACJI ZADANIA PROGRAMOWANIA CAŁKOWITOLICZBOWEGO

Teoretyczne podstawy programowania liniowego

Tworzenie języków specyfikacji dla zagadnień numerycznych

Wykład z modelowania matematycznego. Zagadnienie transportowe.

Języki i techniki programowania Ćwiczenia 2

Transkrypt:

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania Metody optymalizacji Narzędzia optymalizacji w środowisku MATLAB Materiały pomocnicze do ćwiczeń laboratoryjnych T1 część II Opracowanie: Piotr Hirsch, mgr inż. Kazimierz Duzinkiewicz, dr hab. inż. Gdańsk, 04.2016

1. Wstęp. Do wykonania zadań laboratoryjnych niezbędna jest podstawowa znajomość środowiska programowego MATLAB w zakresie obejmowanym na przedmiocie Technologie Informatyczne. Ten materiał pomocniczy koncentruje się na przypomnieniu i rozszerzeniu wiedzy na temat sposobów implementacji plików funkcyjnych (w skrócie funkcji) i ich wykorzystaniu w celach optymalizacji. Kolejnym zagadnieniem jest omówienie możliwości pakietu Optimization Toolbo. Jest to dodatek do środowiska MATLAB, który zawiera metody i algorytmy optymalizacji dla szerokiej klasy problemów. 2. Funkcje w narzędziach optymalizacji Aby wywołać procedurę optymalizacyjną trzeba przekazać jej funkcję kryterialną i funkcje ograniczeń, o ile takie występują. W niektórych przypadkach użytkownik powinien przedstawić także funkcje zwracające jakobian lub hessian problemu. Istnieją dwa podstawowe sposoby implementacji takich funkcji. Pierwszy z nich dotyczy tworzenia plików funkcyjnych, które, w celu odróżnienia od funkcji zaimplementowanych w środowisku, określa się mianem funkcji zewnętrznych. Podstawowa składnia implementacji funkcji w środowisku MATLAB wygląda następująco: function [argumenty wyjściowe] = nazwa_funkcji(argumenty wejściowe) ciąg instrukcji end Słowo kluczowe function na początku M-pliku wskazuje na to, że dany skrypt traktowany będzie jako funkcja, w tym celu należy go zapisać z nazwą identyczną z nazwą funkcji. Funkcja posiadać może wiele lub zero argumentów wejściowych jak i wyjściowych. W typowych przypadkach nie musimy zakańczać definicji funkcji słowem kluczowym end. Staje się to konieczne dopiero, gdy implementujemy funkcje zagnieżdżone. Istotnym jest fakt, że funkcje w środowisku MATLAB operują na swoich własnych workspace, czyli przestrzeniach roboczych, w których przechowywane są wszelkie dane i zmienne. Oznacza to, że funkcja nie posada dostępu do danych zapisanych w bazowej przestrzeni roboczej, o ile nie są to zmienne globalne. W przypadku, gdy funkcja nie zwraca argumentów wyjściowych, może zostać zapisana w następującej postaci: function nazwa_funkcji(argumenty wejściowe) ciąg instrukcji Skrypt zawierający definicję funkcji można rozbudować o dodatkowe funkcje lokalne. Działanie takie może być podyktowane np. chęcią tworzenia tylko jednego pliku do obsługi całej procedury optymalizacyjnej. Większość procedur optymalizacyjnych z pakietu Optimization toolbo przyjmuje zmienne typu function_handle. Z tego powodu, żeby przekazać do takiej procedury funkcję zapisaną w postaci pliku funkcyjnego, wykorzystać należy operator @: procedura_optymalizacyjna(@funkcja_kryterialna, pozostale_argumenty) w tym wypadku @ tworzy function_handle do pliku funkcja_kryerialna.m.

Drugim sposobem implementacji funkcji jest zastosowanie tak zwanych funkcji anonimowych. Funkcje te nie są przechowywane w pliku, a w postaci zmiennej o typie function_handle. Oznacza to, że znajdują się w przestrzeni roboczej tak jak zmienne, ale zachowują się jak funkcje. Funkcje anonimowe definiujemy bezpośrednio w kodzie z wykorzystaniem operatora @: funkcja_anonimowa=@(argumenty)instrukcja; Sposób ten wykorzystywany jest najczęściej do definiowania prostych funkcji kryterialnych. W wielu przypadkach, gdy funkcja którą chcemy wykorzystać przyjmuje argumenty w postaci function_handle, nie zachodzi potrzeba tworzenia zmiennej w przestrzeni roboczej do przechowywania funkcji anonimowej. Możliwe jest utworzenie tymczasowej funkcji anonimowej wewnątrz wyrażenia: procedura_optymalizacyjna(@(argumenty_f_anonimowej)f_anonimowa,... pozostale_argumenty) Funkcje przekazywane do procedur optymalizacyjnych zaimplementowanych w Optimization toolbo powinny przyjmować tylko jeden argument. Oznacza to, że w przypadku funkcji wielu zmiennych, zmienne te muszą znajdować się w pojedynczym wektorze lub macierzy. Rozważmy funkcję przyjmującą argumenty, y i z postaci: f() = 3*( y) 4 + 4*( + z) 2 / (1 + 2 + y 2 + z 2 ) + cosh( 1) + tanh(y + z). Funkcję tą zapisać można tak, żeby przyjmowała jeden argument w postaci wektora in = [;y;z]: function f = f_kryterialna(in) f = 3*(in(1)-in(2))^4 + 4*(in(1)+in(3))^2/(1+norm(in)^2)... + cosh(in(1)-1) + tanh(in(2)+in(3)); Często spotkać się można z potrzebą przekazania do funkcji kryterialnej dodatkowych parametrów, których nie chcemy jednak traktować jako zmienne w optymalizacji. Istnieje kilka mechanizmów, które to umożliwiają. Jednym z nich jest wykorzystanie zmiennych globalnych definiowanych z użyciem słowa kluczowego global, jednak nie jest to polecana procedura, ze względu na kłopoty nad zapanowaniem nad tym rodzaje zmiennych. Drugi sposób opiera się o wykorzystanie funkcji anonimowych. Przyjmijmy funkcję kryterialną postaci: function y = parameterfun(,a,b,c) y = (a - b*(1)^2 + (1)^4/3)*(1)^2 + (1)*(2) +... (-c + c*(2)^2)*(2)^2; Wykorzystując poznane mechaniki definiowania funkcji anonimowych, możemy w prosty sposób przekształcić parameterfun do funkcji z jednym argumentem i wykorzystać ją w procedurze optymalizacyjnej:

a = 4; b = 2; c = 4; % Przypisanie parametrów f = @()parameterfun(,a,b,c); procedura_optymalizacyjna(f,pozostale_argumenty) Trzeci sposób wykorzystuje mechanizm przekazywania przez funkcje z pakietu Optimization toolbo dodatkowych informacji do funkcji kryterialnej. Załóżmy, że wszelkie dodatkowe parametry znajdują się w strukturze parametry, która w szczególności może mieć postać wektora. W takim wypadku funkcja kryterialna parameterfun przyjmuje postać: function y = parameterfun(,parametry) a = parametry(1); b = parametry(2); c = parametry(3); y = (a - b*(1)^2 + (1)^4/3)*(1)^2 + (1)*(2) +... (-c + c*(2)^2)*(2)^2; Strukturę parametry umieszczamy w wywołaniu procedury optymalizacyjnej jako ostatni argument, niezależnie od tego, czy wykorzystujemy wszystkie poprzednie. Przykładowe wywołania procedury fmincon dla tego przypadku: [,fval]=fmincon(@parameterfun,0,[],[],aeq,beq,lb,ub,[],[],parametry) Środowisko MATLAB pozwala użytkownikowi na elastyczne zarządzanie liczbą argumentów wyjściowych i wejściowych funkcji. Oznacza to, że możliwe jest wywołanie funkcji bez podawania jej pełnej listy parametrów, oraz że funkcja zwracać może tylko tyle argumentów wyjściowych, ile jest od niej oczekiwanych. Poleceniami umożliwiającymi obsługę zmiennej liczby argumentów są nargin i nargout, które, użyte w ciele funkcji, zwracają odpowiednio liczbę podanych argumentów wejściowych i żądanych wyjściowych. Przykład funkcji obsługującej niepełną liczbę argumentów wejściowych: function y=pow(,a) if nargin<2 a=2; end y=.^a; przykładowe wywołania: >> pow(4) ans = 16 >> pow(4,2) ans = 16

3. Optimization toolbo W Tabeli I przedstawiono spis wybranych procedur optymalizacyjnych zaimplementowanych w Optimization toolbo, wraz z określeniem do jakiego rodzaju programowania (zwyczajowa nazwa używana w odniesieniu do metod optymalizacji komputerowej) dana metoda jest przeznaczona. W kolumnie drugiej tabeli przedstawiono zapis matematyczny danego problemu. Przyjęte oznaczenia zakładają, że jest wektorem zmiennych optymalizowanych a f() stanowi funkcję kryterialną. Tabela 1. Zbiór procedur optymalizacyjnych Rodzaj programowania Nieliniowe jednej zmiennej Nieliniowe wielu zmiennych bez ograniczeń Nieliniowe wielu zmiennych z ograniczeniami Zapis matematyczny Funkcja w Optimization toolbo wersja 3.0 min f() 1 < < 2 fminbnd min f() fminunc fminsearch min f() c() 0, c eq () = 0 A b, A eq = b eq fmincon Liniowe najmniejszych kwadratów z ograniczeniami Nieliniowe najmniejszych kwadratów Liniowe Kwadratowe Układ równań nieliniowych jednej zmiennej Układ równań nieliniowych wielu zmiennych lb < < ub 2 min C d 2 A b, A eq = b eq lb < < ub min 2 F() 2 2 lb < < ub min f T A b, A eq = b eq 1 lb < < ub min 2 T H + f T A b, A eq = b eq 1 lb < < ub f(a) = 0 F() = 0 n równań n zmiennych lsqlin lsqnonlin linprog quadprog fzero fsolve Definiując problem optymalizacji należy zadbać o jego właściwe zaimplementowanie względem wybranej procedury. Zapis f() w Tabeli I oznacza funkcję skalarną, F() funkcję wektorową, a f T funkcję liniową,

którą podaje się jako wektor współczynników f. Macierz A i wektor b to odpowiednio lewa i prawa strona ograniczeń liniowych mniejszościowych. Macierz A eq i wektor b eq stanowią natomiast lewą i prawą stronę ograniczeń liniowych równościowych. Oznaczenia lb i ub to odpowiednio większościowe i mniejszościowe warunki brzegowe. Funkcje c() i c eq() to ograniczenia nieliniowe mniejszościowe i równościowe. Wszystkie te zapisy stanowią standardowe formy przedstawiania problemów optymalizacji, jeśli napotkany problem posiada inną postać, to należy go przekształcić do postaci standardowej. Poszczególne procedury różnią się między sobą składnią, głównie ilością przyjmowanych argumentów (czasem kolejnością). W Tabeli II przedstawiono ogólną składnie wybranych procedur: Tabela II. Zbiór wybranych procedur optymalizacyjnych Procedura fminbnd fminunc fminsearch fmincon lsqlin lsqnonlin linprog quadprog fzero fsolve Składnia [X,FVAL,EXITFLAG] =fminbnd(fun,1,2,options) [X,FVAL,EXITFLAG] = fminunc(fun,x0,options) [X,FVAL,EXITFLAG] = fminsearch(fun,x0,options) [X,FVAL,EXITFLAG] = fmincon(fun,x0,a,b,aeq,beq,lb,ub,nonlcon,options) [X,RESNORM,RESIDUAL,EXITFLAG] = lsqlin(c,d,a,b,aeq,beq,lb,ub,x0,options) [X,RESNORM,RESIDUAL,EXITFLAG] = lsqnonlin(fun,x0,lb,ub,options) [X,FVAL,EXITFLAG] = linprog(f,a,b,aeq,beq,lb,ub) [X,FVAL,EXITFLAG] = quadprog(h,f,a,b,aeq,beq,lb,ub,x0,options) [X,FVAL,EXITFLAG] = fzero(fun,x0,options) [X,FVAL,EXITFLAG] = fsolve(fun,x0,options) Według oznaczeń przyjętych w Tabeli II FUN odpowiada za funkcję kryterialną (typ danych to function_handle); OPTIONS to struktura zawierająca opcje optymalizacji, tworzona za pomocą polecenia optimoptions; X0 oznacza punkt startowy; NONLCON to oznaczenie funkcji zwracającej wartości nieliniowych ograniczeń nierównościowych i równościowych; pozostałe oznaczenia są zgodne z tymi z Tabeli I. Argumenty wyjściowe określają się następująco: X jest rozwiązaniem optymalizacji, czyli zawiera optymalne wartości zmiennych; FVAL to wartość funkcji kryterialnej w punkcie optymalnym; EXITFLAG flaga wystawiana przez procedurę, która określa przyczynę zakończenia optymalizacji, jej wartości różnią się w zależności od procedury; RESNORM to wartość kryterium dla problemów najmniejszych kwadratów; RESIDUAL stanowi wektor residuów problemów najmniejszych kwadratów. Oprócz wymienionych, poszczególne funkcje zwracać mogą różne dodatkowe wartości, takie jak gradient lub hessian w punkcie optymalnym. Wywołując poszczególne procedury nie musimy podawać wszystkich argumentów wejściowych. W takim wypadku przyjmują one domyślne wartości. Nie można jednak pomijać żadnego argumentu, jeśli chcemy wykorzystać argument znajdujący się za nim (np. NONLCON znajduje się za A w procedurze fmincon), musimy podać wtedy pusty argument: [].

Poleceniem optimoptions możemy tworzyć i modyfikować strukturę z opcjami optymalizacji. Każda procedura posiada swój domyślny zestaw opcji i wystarczy jedynie, że modyfikować będziemy interesujące nas opcje. Ogólna postać polecenia optimoptions wygląda następująco: OPTIONS = optimoptions(solver,'param1',value1,...) Przykładowe wywołanie optimoptions, które ustala próg tolerancji na minimalną zmianę zmiennych optymalizowanych, maksymalną liczbę iteracji i wyświetlanie szczegółów iteracji w command window dla procedury fminunc: options = optimoptions('fminunc', 'TolX', 0.01, 'MaIter',... 1000, 'display', 'iter') Każda procedura oprócz ogólnych opcji zawiera także swoje własne opcje szczegółowe np. dotyczące wyboru algorytmu. W Tabeli III przedstawiono wybrane, najczęściej modyfikowane opcje. Tabela III. Zbiór wybranych opcji Nazwa opcji Display Diagnostics MaFunEvals MaIter TolCon TolFun TolX GradObj DerivativeCheck Argument określa poziom szczegółowości wyświetlanych w command window informacji: off lub none brak iter wyświetla informacje po każdej iteracji i informacje końcowe iter-detailed wyświetla to co iter plus rozbudowaną informacje techniczną na koniec notify wyświetla powiadomienie jeśli procedura optymalizacji się nie powiedzie final/final-detailed wyświetla informacje końcowe/rozbudowane informacje końcowe wyświetla informacje o rozwiązywanym problemie optymalizacji on włączone off domyślnie wyłączone dodatnia liczba naturalna, określa maksymalną liczbę ewaluacji funkcji kryterialnej dodatnia liczba naturalna, określa maksymalną liczbę iteracji tolerancja na naruszenie ograniczeń próg tolerancji na zmianę funkcji kryterialnej próg tolerancji na zmianę zmiennych optymalizowanych gradient funkcji kryterialnej definiowany przez użytkownika on funkcja kryterialna zwraca wartość gradientu off gradient jest domyślnie przybliżany w oparciu o metodę różnic skończonych sprawdza poprawność zdefiniowanego przez użytkownika gradientu poprzez porównanie go do przybliżenia uzyskanego w oparci o metodę różnic skończonych on porównanie włączone off porównanie domyślnie wyłączone

Optimization toolbo wykorzystywać można w sposób klasyczny, to jest własnoręcznie tworzyć skrypty optymalizacyjne w oparciu o procedury przybornika, lub poprzez graficzną aplikację o nazwie Optimization App, wywoływaną poleceniem optimtool.