# opti.m

tekijä: Vesa Aulis Apaja Viimeisin muutos maanantai 25. marraskuuta 2013, 13.51
Program to modify in demo 3 (essentially same program in Materiaalikansio)

opti.m — Objective-C source code, 1 KB (1383 bytes)

## Tiedoston sisältö

```% Pure Newton, goes actually uphill
clear all; close all;
f = @(x) (x(1)+x(2)).^2+10.*cos(x(1).^2+x(2)).^2;
h = 10^-10;
h1 = [h 0]; h2 = [0 h];
hh = 10^-20;
hh1 = [hh 0]; hh2 = [0 hh];
path=[];
a = 0;
x0  = [-1.5 1.5];x=x0;
path=[path ;x0];
n = 0;

fx = f(x);f0=fx+10;
fun=fx;

fprintf('%5d %20.15f %20.15f %20g\n',n,x,fx)
n=n+1;
while abs(fx-f0)>10^-16
f0 = fx;
% compute derivatives using imaginary step
% - numerically very accurate
gf = @(x) [f(x+i*hh1) f(x+i*hh2)]/hh;
gg = imag(gf(x));
% Hessian - not so accurate!
g1 = imag(gf(x+h1)-gf(x-h1))/(2*h);
g2 = imag(gf(x+h2)-gf(x-h2))/(2*h);
H= [g1 ; g2 ];
%p  = linsolve(H,-gg');  % Matlab only
p = H\(-gg'); % Matlab and octave
x  = x+p';
fp = f(x);
path=[path;x];
fx = fp;
fun=[fun;fx];
fprintf('%5d %20.15f %20.15f %20g %20g \n',n,x,fx,a)
a = a/10;
n = n+1;
if n>100
break;
end
end
figure(1)
plot(fun,'b-o')
xlabel('iteration')
ylabel('f(x)')
figure(2)
x1=min(path(:,1))-1;
x2=max(path(:,1))+1;
y1=min(path(:,2))-1;
y2=max(path(:,2))+1;
x=x1:0.1:x2;
y=y1:0.1:y2;
[X,Y]=meshgrid(x,y);
for i=1:size(X,1)
for j=1:size(X,2)
x=[X(i,j) Y(i,j)];
Z(i,j)=f(x);
end
end
contour(X,Y,Z,10) ;colorbar;hold on;
x=[path(:,1) path(:,2)];
plot(path(:,1),path(:,2),'mo-','linewidth',2);

```