Toto je starší verze dokumentu!
Zadání (Minimalizace funkcí jedné proměnné)
Návrh řešení:
clc; clear; close all; %% LineSearch %% Newtonovou metodou najdete oba koreny rce x^2 = 2 % df(x)/dx = 2*x; % f(x) = x^2 - 2; syms x; % budeme pouzivat symbolickou promenou x f = x^2 - 2; % symbolicka funkce df = diff(f,x); % derivace symbolicke funkce (zas symbolicka fce) iteraci = 7; % kolik mame provest iteraci (7 je zvolene, muze byt mene) resX = 2; % zvolena 0. iterace... for i=1:iteraci resX = resX - subs(f,x,resX)/subs(df,x,resX); end; x1 = resX % 1. koren resX = -2; % zvolena 0. iterace for i=1:iteraci resX = resX - subs(f,x,resX)/subs(df,x,resX); end; x2 = resX % 2. koren %% Najdete minimum priblizne metodou zlateho rezu clear; % interval interval = [0 5]; delka = interval(2) - interval(1); syms x; f = cos(x + 1) + 0.05.*(x - 2).^2; %f = (x-4)^2; w = (3 - 5^(0.5))/2; % prvotni rozlozeni a,b,c a = interval(1); b = a + w * delka; c = interval(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % MELO BY SE OSETRIT, ABY PLATILO: % % a < b < c; f(a) > f(b) < f(c) % % PRO ZADANY PRIKLAD TO JE SPLNENO, ALE OBECNE TO BYT NEMUSI % nastavime zacatek a konec vetsiho ze dvou intervalu delsiStart = b; delsiEnd = c; iteraci = 0; % cislo iterace / na konci udava, kolik jich bylo provedeno xs = (interval(1):0.01:interval(2)); fx = subs(f,x,xs); treshold = 0.001; % ukoncit, kdyz delka intervalu je mensi nez 0.001 while (c-a>treshold) iteraci = 1 + iteraci; % zvolime d d = delsiStart + w*(delsiEnd-delsiStart); fa = subs(f,x,a); fb = subs(f,x,b); fc = subs(f,x,c); fd = subs(f,x,d); if (fd<fb) % min je mezi a, b if (d<b) % min je mezi a, b delsiStart = d; delsiEnd = b; c = b; b = d; else % min je mezi b, c delsiStart = d; delsiEnd = c; a = b; b = d; end; else % min asi mezi a, d if (d<b) a = d; delsiStart = b; delsiEnd = c; else c = d; delsiStart = b; delsiEnd = a; end; end; end; % while figure; hold on; plot(xs,fx); plot(a,subs(f,x,a),'ro'); plot(b,subs(f,x,b),'go'); plot(c,subs(f,x,c),'bo'); plot(d,subs(f,x,d),'r+'); hold off; %% dohledat newtonovou metodou... % POZOR! hledame koreny funkce po zderivovani (hledame minimum) df = diff(f,x); % 1. derivace symbolicke funkce (zas symbolicka fce) ddf = diff(df,x); % 2. derivace symbolicke funkce (zas symbolicka fce) iter = 7; % kolik mame provest iteraci (7 je zvolene, muze byt mene) resX = b; % zvolena 0. iterace... bod b je zjevne nejlepsi kandidat na odhad minima for i=1:iter resX = resX - subs(df,x,resX)/subs(ddf,x,resX); end; minimum = resX % min