global cv th rn; cv = [ 0 0.25 -0.15]; th = [ 0 0 0]; rn = [ 1 1.5 1 ]; x = [ 0.25 -0.15]'; for (k=1:2) fprintf('step %d\n',k); [A fz] = calculate_derivatives(@sing1,x) fprintf('merit function: %g\n',norm(fz)); s = -A\fz x = x + s end
step 1 A = 0.5000 -0.5000 -0.0292 0.1958 fz = 0.1500 -0.0183 merit function: 0.151116 s = -0.2425 0.0575 x = 0.0075 -0.0925 step 2 A = 0.5000 -0.5000 -0.0302 0.0719 fz = 0.0000 -0.0034 merit function: 0.0034375 s = 0.0825 0.0825 x = 0.0900 -0.0100
function f = sing1(v); global cv th rn; cv(2)=v(1); % first surface curvature cv(3)=v(2); % second surface curvature yap = 5.0; uco = 0.1; scl = yap^2/2; ya = parax([yap 0],cv,th,rn); yc = parax([0 uco],cv,th,rn); f(1) = -ya(4,2)/ya(1,1) - 1/20; % power error w = ford(ya,yc,cv,th,rn,1); f(2) = w(2)/scl; f = f';
function [A, fz] = calculate_derivatives(f,v) fz = feval(f,v); nv = length(v); delta = 1e-5; for j=1:nv vold = v(j); v(j) = vold+delta; fp = feval(f,v); v(j) = vold-delta; fn = feval(f,v); A(:,j)=(fp-fn)/(2*delta); v(j)=vold; end
Maintained by John Loomis, last updated 6 Feb 2003