Toto je starší verze dokumentu!


Cvičení 11

Minimalizace funkcí jedné proměnné

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
courses/a4b33opt/cviceni11.1259519806.txt.gz · Poslední úprava: 2025/01/03 18:23 (upraveno mimo DokuWiki)
Nahoru
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0