2)基於matlab語言的函數定義
function [x0,X,iter] = steepest_descent(f,x0,tol,maxiter)
df=sdf(f,x0);f_sym1='f(';df_sym='df(';
for k=1:length(x0)
f_sym1=[f_sym1,'x1(',num2str(k),'),'];
df_sym=[df_sym,'x0(',num2str(k),'),'];
end
f_sym1(end)=[];f_sym1=[f_sym1,')'];df_sym(end)=[];df_sym=[df_sym,')'];
f_td = eval(df_sym);d_k=-f_td/norm(f_td);iter=0;X=x0;nn=0;
while norm(f_td) > tol
if iter > maxiter
break
end
iter = iter+1;
syms SL
assume(SL>=0);x1=x0+SL*d_k;fx1=eval(f_sym1);d_x1=diff(fx1);
d_SL=double(solve(d_x1));fx1=matlabFunction(fx1);
ff=zeros([1 length(d_SL)]);
for ii=1:length(d_SL)
ff(ii)=fx1(d_SL(ii));
end
d_SL=d_SL(ff==min(ff));x0=x0+d_SL(1)*d_k;f_td=eval(df_sym);
d_k=-f_td/norm(f_td);nn=nn+1;X(:,nn+1)=x0;
end
end
2)基於matlab語言的函數定義
function [x0,X,iter] = newton_min(f,x0,tol,maxiter)
df=sdf(f,x0);ddf=sddf(f,x0);
df_sym='df(';ddf_sym='ddf(';
for k=1:length(x0)
df_sym=[df_sym,'x0(',num2str(k),'),'];
ddf_sym=[ddf_sym,'x0(',num2str(k),'),'];
end
df_sym(end)=[];df_sym=[df_sym,')'];
ddf_sym(end)=[];ddf_sym=[ddf_sym,')'];
f_td = eval(df_sym);iter=-1;X=x0;nn=0;
while norm(f_td) > tol
if iter > maxiter
break
end
nn=nn+1;iter = iter+1;
X(:,nn)=x0;f_td = eval(df_sym);
f_hessian = eval(ddf_sym);
x0 = x0 - f_hessian\f_td;
end
end
2) 基於matlab語言的函數定義
function [x0,X,iter] = BFGS_Newton(f,x0,tol,maxiter)
df=sdf(f,x0);H0=eye(length(x0));f_sym1='f(';df_sym='df(';
for k=1:length(x0)
f_sym1=[f_sym1,'x1(',num2str(k),'),'];
df_sym=[df_sym,'x0(',num2str(k),'),'];
end
f_sym1(end)=[];f_sym1=[f_sym1,')'];df_sym(end)=[];
df_sym=[df_sym,')'];f_td = eval(df_sym);iter=0;X=x0;nn=0;
while norm(f_td) > tol
if iter > maxiter
break
end
iter = iter+1;
syms SL
assume(SL>=0);p0=-H0*f_td;x1=x0+SL*p0;fx1=eval(f_sym1); d_x1=diff(fx1); d_SL=double(solve(d_x1));
fx1=matlabFunction(fx1);ff=zeros([1 length(d_SL)]);
for ii=1:length(d_SL)
ff(ii)=fx1(d_SL(ii));
end
d_SL=d_SL(ff==min(ff)); x0=x0+d_SL*p0; f_td2=eval(df_sym);dgk=f_td2-f_td;f_td=f_td2;dxk=d_SL*p0;
H0=H0+(dxk*dxk')/(dxk'*dgk)*(1+dgk'*H0*dgk/(dxk'*dgk))-(dxk*dgk'*H0+H0*dgk*dxk')/(dxk'*dgk);
nn=nn+1;X(:,nn+1)=x0;
end
end
2)基於matlab語言的函數定義
function [x0,X,iter] = conj_grad(f,x0,tol,maxiter)
df=sdf(f,x0);f_sym1='f(';df_sym='df(';
for k=1:length(x0)
f_sym1=[f_sym1,'x1(',num2str(k),'),'];
df_sym=[df_sym,'x0(',num2str(k),'),'];
end
f_sym1(end)=[];f_sym1=[f_sym1,')'];
df_sym(end)=[];df_sym=[df_sym,')'];
f_td = eval(df_sym);p0=-f_td;iter=0;X=x0;nn=0;
while norm(f_td) > tol
if iter > maxiter
break
end
iter = iter+1;
syms SL
assume(SL>=0);x1=x0(:)+SL*p0;fx1=eval(f_sym1);
d_x1=diff(fx1);d_SL=double(solve(d_x1));
fx1=matlabFunction(fx1);ff=zeros([1 length(d_SL)]);
for ii=1:length(d_SL)
ff(ii)=fx1(d_SL(ii));
end
d_SL=d_SL(ff==min(ff));x0=x0(:)+d_SL*p0;
f_td2=eval(df_sym);p0=-f_td2+p0*(f_td2'*(f_td2-f_td))/(norm(f_td)^2);
f_td=f_td2;d_k=-f_td/norm(f_td);nn=nn+1;X(:,nn+1)=x0;
end
end
代碼部分由王曉東同學提供