drugi izvestaj
TRANSCRIPT
-
8/3/2019 drugi izvestaj
1/23
December
12, 2011METODI OPTIMIZACIJE
- 0 -
Metodi optimizacije
Drugi izvetaj
Primenjene numerike metode korienjem
programskog paketa Matlab
Dositej ajinovi 1173/10
Profesor: Boirar Rosi Datum: 12.12.2011
-
8/3/2019 drugi izvestaj
2/23
December
12, 2011METODI OPTIMIZACIJE
- 1 -
SADRAJ
1. Newton-Raphson metoda 22. Nelder-Mead metoda 5
3. Metoda seice 11
4. Metoda zlatnog preseka 16
5. Metoda polovljenja intervala 17
6. Metoda parabole 19
7. Regula-Falsi metoda 21
8. Literatura 22
-
8/3/2019 drugi izvestaj
3/23
December
12, 2011METODI OPTIMIZACIJE
- 2 -
1. Newton-Raphson metodafunction x = newton(f_str,df_str,x0,n)f = inline(f_str);df = inline(df_str);disp('Broj iteracija =')disp(0)x = x0;xn = 0;disp('Xn =')disp(x)disp('f(x) =')disp(f(x))disp('f''(x) =')disp(df(x))for i = 1:n
xn = x - (f(x)/df(x));if x == xn
disp('Ovo je najvisa postignuta tacnost')i = i-1;break
endx = [-10.0:0.01:10.0];
plot(x,f(x));x = xn;disp('Broj iteracija =')disp(i)disp('Xn =')disp(x)disp('f(x) =')disp(f(x))disp('f''(x) =')disp(df(x))enddisp('Broj izvrsenih iteracija:')disp(i)end
Napomena: funkcija se u komandnom prozoru unosi na sledei nain:
newton(funkcija',prvi izvod funkcije',prva procena,broj iteracija)
npr: newton('sin(x/3)+cos(x/2)','1/6*(2*cos(x/3)-3*sin(x/2))',0.1,10)
-
8/3/2019 drugi izvestaj
4/23
December
12, 2011METODI OPTIMIZACIJE
- 3 -
Prikaz reenja:
Broj iteracije =
0
Xn =
0.1000
f(x) =
1.0321
f'(x) =
0.3082
Broj iteracije =
1
Xn =
-3.2492
f(x) =
-0.9372
f'(x) =
0.6555
Broj iteracije =
2
Xn =
-1.8195
f(x) =
0.0440
f'(x) =
0.6686
Broj iteracije =
3
-
8/3/2019 drugi izvestaj
5/23
December
12, 2011METODI OPTIMIZACIJE
- 4 -
Xn =
-1.8852
f(x) =
-1.8890e-004
f'(x) =
0.6742
Broj iteracije =
4
Xn =
-1.8850
f(x) =
-3.2034e-009
f'(x) =
0.6742
Broj iteracije =
5
Xn =
-1.8850
f(x) =
-2.2204e-016
f'(x) =
0.6742
Broj iteracije =
6
Xn =
-1.8850
f(x) =
0
f'(x) =
0.6742
Ovo je najvisa postignuta tacnost
-
8/3/2019 drugi izvestaj
6/23
December
12, 2011METODI OPTIMIZACIJE
- 5 -
Broj izvrsenih iteracija:
6
ans =
-1.8850
Slika 3a: Grafiki prikaz reenja
2. Metoda Nelder-Meadfunction [ x_opt, n_feval ] = nelder_mead ( x, function_handle,flag )
% Autor:%% Jeff Borggaard%% Parametri:
-
8/3/2019 drugi izvestaj
7/23
December
12, 2011METODI OPTIMIZACIJE
- 6 -
%% Ulaz, realni X (M+1,M) koji predstavljaju tacke koje sluze za% pretpostavljanje pocetnih vrednosti resenja. Ako je dimenzijaprostora% M, onda matrica mora sadrzati M+1 tacaka. Na primer, za 2Dprostor
% moraju se dati tri tacke. Svaki red matrice predstavlja jednutacku;% za ravan ovo znaci da bi X bila matrica dimenzije 3x2.%% Input, handle FUNCTION_HANDLE, izraz funkcije pod navodnicima,% ili ime M-filea koji definise funkciju, sa znakom "@" kojiprethodi% funkciji.%% Ulaz, logicki indikator koji je opcioni argument. Ako jeprisutan, i% postavljen na 1 program ce pokazaci graficku sliku konture iproceduru% pronalazenja resenja. Ovo samo ima smisla za dvodimenzionalne% probleme, odnosno za N=2.%% Izlaz, realan X_OPT, optimalna vrednost X-a pronadjenog pomocualgoritma.
rho = 1; % rho > 0xi = 2; % xi > max(rho, 1)gam = 0.5; % 0 < gam < 1sig = 0.5; % 0 < sig < 1
tolerance = 1e-6;max_feval = 250;
% Initialization[temp,n_dim] = size(x);
if (temp-n_dim ~= 1)fprintf ( 1, '\n' );fprintf ( 1, 'NELDER_MEAD - Fatal error!\n' );error('number of points must be = number of design variables +
1\n');end
if (nargin==2)flag = 0;
end
if (flag)xp = linspace(-5,5,101);yp = xp;for i=1:101for j=1:101fp(j,i) = feval(function_handle,[xp(i),yp(j)]);
endend
-
8/3/2019 drugi izvestaj
8/23
December
12, 2011METODI OPTIMIZACIJE
- 7 -
figure(27)hold oncontour(xp,yp,fp,linspace(0,200,25))
if (flag)
plot(x(1:2,1),x(1:2,2),'r')plot(x(2:3,1),x(2:3,2),'r')plot(x([1 3],1),x([1 3],2),'r')pauseplot(x(1:2,1),x(1:2,2),'b')plot(x(2:3,1),x(2:3,2),'b')plot(x([1 3],1),x([1 3],2),'b')
end
end
index = 1:n_dim+1;
[f ] = evaluate(x,function_handle);n_feval = n_dim + 1;
[f,index] = sort ( f );x = x(index,:);
%% Begin the Nelder Mead iteration.%converged = 0;diverged = 0;
while ( ~converged & ~diverged )%
% Compute midpoint of simplex opposite worst point.%
x_bar = sum(x(1:n_dim,:)) / n_dim;%% Compute reflection point.%
x_r = (1+rho)*x_bar - rho*x(n_dim+1,:);f_r = feval(function_handle,x_r); n_feval = n_feval+1;
%% Accept the point:%
if (f(1)
-
8/3/2019 drugi izvestaj
9/23
December
12, 2011METODI OPTIMIZACIJE
- 8 -
x_e = (1+rho*xi)*x_bar - rho*xi*x(n_dim+1,:);f_e = feval(function_handle,x_e); n_feval = n_feval+1;
if (f_e
-
8/3/2019 drugi izvestaj
10/23
December
12, 2011METODI OPTIMIZACIJE
- 9 -
% test for divergence%
diverged = n_feval>max_feval;
if (flag)plot(x(1:2,1),x(1:2,2),'r')
plot(x(2:3,1),x(2:3,2),'r')plot(x([1 3],1),x([1 3],2),'r')pauseplot(x(1:2,1),x(1:2,2),'b')plot(x(2:3,1),x(2:3,2),'b')plot(x([1 3],1),x([1 3],2),'b')
endend
if ( 0 )fprintf('The best point x^* was: %d %d\n',x(1,:));fprintf('f(x^*) = %d\n',f(1));
end
x_opt = x(1,:);
if ( diverged )fprintf ( 1, '\n' );fprintf ( 1, 'NELDER_MEAD - Warning!\n' );fprintf ( 1, ' The maximum number of function evaluations was
exceeded\n')fprintf ( 1, ' without convergence being achieved.\n' );
end
return
endfunction f = evaluate(x,function_handle);
%*****************************************************************************80%%% EVALUATE handles the evaluation of the function at each point.%[temp,n_dim] = size(x);
f = zeros(1,n_dim+1);
for i=1:n_dim+1
f(i) = feval(function_handle,x(i,:));end
returnendfunction [ x, f ] = shrink(x,function_handle,sig)
%*****************************************************************************80
-
8/3/2019 drugi izvestaj
11/23
December
12, 2011METODI OPTIMIZACIJE
- 10 -
%%% SHRINK ...%% In the worst case, we need to shrink the simplex along each edgetowards% the current "best" point. This is quite expensive, requiring
n_dim new% function evaluations.
[temp,n_dim] = size(x);
x1 = x(1,:);f(1) = feval(function_handle,x1);
for i=2:n_dim+1x(i,:) = sig*x(i,:) + (1-sig)*x(1,:);f(i ) = feval(function_handle,x(i,:));
end
returnend
Ova funkcija se moe uneti argumentima u komandnom prozoru:
nelder_mead ( x, function_handle, flag )
A priloena je i posebna funkcija (example.m) u kojoj bismo mi definisali samu funkciju cilja:
function f = example ( x )f = ( tan(x(1))^2 + x(2)^2);
Pozivanje funkcije nelder_mead.m, uz samu funkciju kao parametar definisan u example.m
vri se pokretanjem fajla pozivanje.m koji mora biti u istom folderu kao i dva navedena.n=2;x_init=[3, -3; 2, -4; -1, -2];x_opt = nelder_mead ( x_init, @example, 1 )
to znai - optimizacija vrednosti x-a vri se nelder_mead metodom definisanom u svom fajlu, sainicijalnom vrednou x-a (x_init) koju smo sami pretpostavili (x_init=[3, -3; 2, -4; -1, -2]),
-
8/3/2019 drugi izvestaj
12/23
December
12, 2011METODI OPTIMIZACIJE
- 11 -
uzevi izraz funkcije cilja definisane u svom fajlu (@example), setovanjem indikatora na 1, imepotvrujemo da elimo plotovanje grafikog prikaza.
Reenje:
x_opt =
1.5679 -3.7949
Slika 2: Grafiki prikaz konvergiranja ka reenju
3. Metoda seice
% Funkcija u f(x) = 0f = inline('x^5-0.2*x^3+2.7*10^(-4)');% Prva pretpostavkaxguess1 = 0.05;% Druga pretpostavkaxguess2 = 0.02;
-
8/3/2019 drugi izvestaj
13/23
December
12, 2011METODI OPTIMIZACIJE
- 12 -
% Donja granica x-alxrange = -0.02;% Gornja granica x-auxrange = 0.12;
% Resenje:
maxi = f(lxrange);mini = f(lxrange);for i=lxrange:(uxrange-lxrange)/10:uxrange
if f(i) > maximaxi = f(i);
endif f(i) < mini
mini = f(i);end
endtot=maxi-mini;mini=mini-0.1*tot;
maxi=maxi+0.1*tot;
% Racunanje velicine prozora za figureset(0,'Units','pixels')scnsize = get(0,'ScreenSize');wid = round(0.5*scnsize(3));hei = round(0.5*scnsize(4));wind = [1, 1, wid, hei];
% Graf funkcije i dve linije koje predstavljaju prve dve pretpostavkefigure('Position',wind)clffplot(f,[lxrange,uxrange])hold onplot([xguess1,xguess1],[maxi,mini],'g','linewidth',2)plot([xguess2,xguess2],[maxi,mini],'g','linewidth',2)plot([lxrange,uxrange],[0,0],'k','linewidth',1)title('Uneta funkcija na zadatom intervalu sa pretpostavljenim resenjima')
hold off
-
8/3/2019 drugi izvestaj
14/23
December
12, 2011METODI OPTIMIZACIJE
- 13 -
Slika 3: Prikaz unete f-je u pretpostavke
% Prva iteracijafigure('Position',wind)x1 = xguess2-(f(xguess2)*(xguess1-xguess2))/(f(xguess1)-f(xguess2));ea=abs((x1-xguess2)/x1)*100;m=(f(xguess2)-f(xguess1))/(xguess2-xguess1);b=f(xguess2)-m*xguess2;lefty=(maxi-b)/m;righty=(mini-b)/m;
clfsubplot(2,1,2),fplot(f,[lxrange,uxrange])hold on
plot([x1,x1],[maxi,mini],'b','linewidth',2)plot([xguess1,xguess1],[maxi,mini],'g','linewidth',2)plot([xguess2,xguess2],[maxi,mini],'g','linewidth',2)plot([lxrange,uxrange],[0,0],'k','linewidth',1)plot([lefty,righty],[maxi,mini],'r','linewidth',2)title('Uneta funkcija na zadatom intervalu sa gornjim i donjim granicama')
subplot(2,1,1), text(0,1,['Iteracija 1'])text(0.1,.8,['x1 = xguess2-(f(xguess2)*(xguess1-xguess2))/(f(xguess1)-f(xguess2)) = ',num2str(x1)])text(0,.4,['Apsolutna relativna aproksimativna greska'])text(0.1,.2,['ea = abs((x1 - xguess2) / x1)*100 = ',num2str(ea),'%'])axis off
hold off
-
8/3/2019 drugi izvestaj
15/23
December
12, 2011METODI OPTIMIZACIJE
- 14 -
Slika 4: Prva iteracija
% Druga iteracija
figure('Position',wind)x0=xguess2;x2 = x1-(f(x1)*(x0-x1))/(f(x0)-f(x1));ea=abs((x2-x1)/x2)*100;m=(f(x1)-f(x0))/(x1-x0);b=f(x1)-m*x1;lefty=(maxi-b)/m;righty=(mini-b)/m;
clfsubplot(2,1,2),fplot(f,[lxrange,uxrange])hold onplot([x2,x2],[maxi,mini],'b','linewidth',2)
plot([x0,x0],[maxi,mini],'g','linewidth',2)plot([x1,x1],[maxi,mini],'g','linewidth',2)plot([lxrange,uxrange],[0,0],'k','linewidth',1)plot([lefty,righty],[maxi,mini],'r','linewidth',2)title('Uneta funkcija na zadatom intervalu sa gornjim i donjim granicama')
subplot(2,1,1), text(0,1,['Iteracija 2'])text(0.1,.8,['x2 = x1-(f(x1)*(x0-x1))/(f(x0)-f(x1)) = ',num2str(x2)])text(0,.4,['Apsolutna relativna aproksimativna greska'])text(0.1,.2,['ea = abs((x2 - x1) / x2)*100 = ',num2str(ea),'%'])axis offhold off
-
8/3/2019 drugi izvestaj
16/23
December
12, 2011METODI OPTIMIZACIJE
- 15 -
Slika 5: Druga iteracija
% Treca iteracijafigure('Position',wind)
x3 = x2-(f(x2)*(x1-x2))/(f(x1)-f(x2));ea=abs((x3-x2)/x3)*100;m=(f(x2)-f(x1))/(x2-x1);b=f(x2)-m*x2;lefty=(maxi-b)/m;righty=(mini-b)/m;
clfsubplot(2,1,2),fplot(f,[lxrange,uxrange])hold onplot([x3,x3],[maxi,mini],'b','linewidth',2)plot([x1,x1],[maxi,mini],'g','linewidth',2)plot([x2,x2],[maxi,mini],'g','linewidth',2)plot([lxrange,uxrange],[0,0],'k','linewidth',1)plot([lefty,righty],[maxi,mini],'r','linewidth',2)title('Uneta funkcija na zadatom intervalu sa gornjim i donjim granicama')
subplot(2,1,1), text(0,1,['Iteracija 3'])text(0.1,.8,['x3 = x2-(f(x2)*(x1-x2))/(f(x1)-f(x2)) = ',num2str(x3)])text(0,.4,['Apsolutna relativna aproksimativna greska'])text(0.1,.2,['ea = abs((x3 - x2) / x3)*100 = ',num2str(ea),'%'])axis offhold off
-
8/3/2019 drugi izvestaj
17/23
December
12, 2011METODI OPTIMIZACIJE
- 16 -
Slika 5: Trea iteracija
4. Metoda Zlatnog preseka
f = inline('cos(2*x) + exp(x)');x = linspace(.5,1, 101);plot(x, f(x))N = 10;a0 = .5 ; b0 = 1;r = (sqrt(5)-1)/2;
alist = zeros(N,1);blist = zeros(N,1);a = a0; b = b0;s = a + (1-r)*(b-a);t = b - (1-r)*(b-a);f1 = f(s);f2 = f(t);for n = 1:N
if f1 < f2b = t;t = s;s = a+(1-r)*(b-a);f2 = f1; f1 = f(s);
elsea = s;s = t;t = b-(1-r)*(b-a);f1 = f2;
-
8/3/2019 drugi izvestaj
18/23
December
12, 2011METODI OPTIMIZACIJE
- 17 -
f2 = f(t);endalist(n) = a;blist(n) = b;
enddisp(' a b f(a) f(b) b-a ')
disp(' ')alist = [a0;alist];blist = [b0; blist];[alist, blist, f(alist), f(blist), blist-alist]
Slika 6. Plotovanje reenja metode zlatnog preseka
5. Metoda polovljenja intervala
function [c,err,yc]=bisect(f,a,b,delta)
c=0;err=Inf;yc=0;ya=f(a);yb=f(b);if ya*yb > 0, return, endmax1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1
c=(a+b)/2;yc=f(c);if yc==0
a=c;
-
8/3/2019 drugi izvestaj
19/23
December
12, 2011METODI OPTIMIZACIJE
- 18 -
b=c;elseif yb*yc>0
b=c;yb=yc;
elsea=c;
ya=yc;endif b-a < delta, break,end
end
c=(a+b)/2;err=abs(b-a);yc=f(c);
x=0:0.001:1;y=f(x);plot(x,y)
Slika 7: Reenje metode polovljenja intervala
-
8/3/2019 drugi izvestaj
20/23
December
12, 2011METODI OPTIMIZACIJE
- 19 -
6. Metoda parabole
function parabola(func, x0, x2, tolx)
% func: nelinearna funkcija koja se minimizuje% x0, x2 :granice intervala% tolx: tolerancija
k = 0; % brojacx1 = (x0 + x2)/2;
% Vrednosti funkcije u tri tackefx0 = feval(func, x0);fx1 = feval(func, x1);fx2 = feval(func, x2);
while (x2 - x0) > tolx % (x2 x0) je uvek pozitivno% Pronalazi minimalnu tacku parabolenumerator = (x2^2 - x1^2)*fx0 - (x2^2 - x0^2)*fx1 + (x1^2 - x0^2) *fx2;denominator = 2*((x2 - x1)*fx0 - (x2 - x0)*fx1 + (x1 - x0)*fx2);xmin = numerator/denominator;% Vrednost funkcije u xminfxmin = feval(func, xmin);% Bira sledece tri tacke za konstrukciju paraboleif xmin < x1
if fxmin < fx1x2 = x1;fx2 = fx1;x1 = xmin;fx1 = fxmin;
elsex0 = xmin;fx0 = fxmin;
endelse
if fxmin < fx1x0 = x1;
fx0 = fx1;x1 = xmin;fx1 = fxmin;
elsex2 = xmin;fx2 = fxmin;
endendk = k + 1;
end
-
8/3/2019 drugi izvestaj
21/23
December
12, 2011METODI OPTIMIZACIJE
- 20 -
fprintf('x0 = %7.6f x2 = %7.6f f(x0) = %7.6f f(x2) = %7.6f \n', x0, x2, fx0,fx2)fprintf('x_min = %7.6f f(x_min) = %7.6f \n',xmin, fxmin)fprintf('broj iteracija = %2d \n', k)
Pozivanje:
parabola('fun', 0, 9, 0.0001)
x=0:0.001:1;y=f(x);plot(x,y)
Slika 8: Reenje metode parabole
-
8/3/2019 drugi izvestaj
22/23
December
12, 2011METODI OPTIMIZACIJE
- 21 -
7. Regula-Falsi metoda (metoda pogrenog poloaja)
format long;
f = @(x) cos(x) + exp(x);
a = 0; b = 1;
step_size = Inf;e_step = 1e-15;n = 0;
while (step_size >= e_step)c = b - (f(b)*(b-a)) / (f(b)-f(a));if f(a)*f(c) < 0
step_size = b - c;b = c;else
step_size = c - a;a = c;endn = n + 1;end
fprintf('Aproksimativni korak nakon %d iteracija je: %12.15f',n,c);
grid on; hold on;title('Regula Falsi (Method of False Position)');
x = linspace(0,1,10);plot(x,f(x));
Slika 9: Reenje metoda Regula-Falsi
-
8/3/2019 drugi izvestaj
23/23
December
12, 2011METODI OPTIMIZACIJE
- 22 -
Literatura:
[1] - Prof. dr. Boidar Rosi - Metodi optimizacije (hendouti)
[2] - Introduction to Optimum Design 2nd ed - J. Arora (Elsevier, 2004) WW
[3] - Matlab: A Practical Introduction to Programming
and Problem Solving - Stormy Attaway
[4] - Applied numerical methods using Matlab - Won Young Yang,
Wenwu Cao, Tae-Sang Chung, John Morris