资源描述
最速下降法与牛顿法结合求无约束最优值.txt珍惜生活——上帝还让你活着,就肯定有他的安排。雷锋做了好事不留名,但是每一件事情都记到日记里面。哈哈,我已经实现了最速下降法语牛顿发的结合,并且还可以动画演示其求解最优值的迭代过程。都已在程序上实现了。(matlab).运行的时,最速下降精度不要弄得太小,到后面的牛顿精度就可以取任意值了。
tic
clc;clear;
syms x1 x2
G=[];
G=input('请输入想x1^2,x2^2,x1*x2,x1,x2,常系数,如[1,2,3,4,5,6] 系数向量=:');
a=G(1,1);b=G(1,2);c=G(1,3);d=G(1,4);e=G(1,5);g=G(1,6);
f=a*x1^2+b*x2^2+c*x1*x2+d*x1+e*x2+g;
%画出原始图像
figure;
x11=-100:0.5:100;
x22=x11;
[x11,x22]=meshgrid(x11,x22);
f11=a.*x11.^2+b*x22.^2+c*x11.*x22+d.*x11+e.*x22+g;
surf(f11),grid on,hold on;
%画出原始图像
df1=diff(f,x1);df2=diff(f,x2);%对函数进行求一阶导
DF=[df1;df2];
df11=diff(df1,x1);df12=diff(df1,x2);
df21=diff(df2,x1);df22=diff(df2,x2);%这里进行求函数二阶导数
DEE=[df11,df12;df21,df22];
x=input('请输入x的初始值为x=[x1,x2],x=:');
x=x';
E=input('请输入你所要求的最速下降法的精度数(一般取3~5)E=:');
%这里进行一些相关初始值的计算
T=[];
d=T;
T(:,1)=subs(DF,[x1,x2],[x(1),x(2)]);
TH=subs(DEE,[x1,x2],[x(1),x(2)]);
%这里进行一些相关初始值的计算
disp('由于你输入的初始值,这里将开始最速下降法搜寻:');
for k=1:100000
d(:,1)=-T(:,1);%d(k)是x(k+1)=x(k)+A(k)*d(k)
A(1)=(T(:,1)'*T(:,1))/(T(:,1)'*TH*T(:,1));
TH=subs(DEE,[x1,x2],[x(1,k),x(2,k)]);
T(:,k)=subs(DF,[x1,x2],[x(1,k),x(2,k)]);
d(:,k+1)=-T(:,k);
A(k)=(T(:,k)'*T(:,k))/(T(:,k)'*TH*T(:,k));
KLJ(:,k)=norm(T(:,k));
GG(k)=subs(f,[x1,x2],[x(1,k),x(2,k)]);
if norm(T(:,k))<E
disp('有这里你就进入牛顿法求最优了');
disp(' ');
disp('FX就是最速下的解 ')
FX=subs(f,[x1,x2],[x(1,k),x(2,k)])
disp(' ');
disp('对应的x值为 ');
x(:,k)
break;
end
x(:,k+1)=x(:,k)+A(k)*d(:,k);
end
toc
%画出最速下降迭代点最终停留位置
figure;
plot3(x11,x22,f11,'r'),grid on;
for tk=1:k
h1=line( 'Color' ,[0 1 0], 'Marker' , '.' , 'MarkerSize' ,20, 'EraseMode' , 'xor' );
set(h1, 'xdata' ,x(1,tk), 'ydata' ,x(2,tk), 'zdata' , GG(tk));
drawnow; % 刷新屏幕
pause(0.1);
end
fop1=getframe(gcf)
image(fop1.cdata)
%画出最速下降迭代点最终停留位置
tic
Y=x(:,k);
EE=input('请输入牛顿最终的精度系数EE=:');
TT(:,1)=subs(DF,[x1,x2],[Y(1),Y(2)]);
THH=subs(DEE,[x1,x2],[Y(1),Y(2)]);
aa=1;
disp('程序可以运行到这里');
for kk=1:10000
dd(:,kk)=-inv(THH)*TT(:,kk);
Y(:,kk+1)=Y(:,kk)+ aa*dd(:,kk);
THH=subs(DEE,[x1,x2],[Y(1,kk),Y(2,kk)]);
TT(:,kk+1)=subs(DF,[x1,x2],[Y(1,kk+1),Y(2,kk+1)]);
PP=norm(TT(:,kk));
GG1(kk)=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)]);
if PP<EE
disp('到这里您已经得到全局最优解了');
FXX=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)])
disp(' ');
disp('对应的x值为: ');
Y(:,kk)
break;
end
end
FXX=subs(f,[x1,x2],[Y(1,kk),Y(2,kk)])
toc
%画出最终极值点停留位置
figure;
plot3(x11,x22,f11,'r'),grid on;
for J=1:kk
h2=line( 'Color' ,[0 1 0], 'Marker' , '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' );
set(h2, 'xdata' ,Y(1,J), 'ydata' ,Y(2,J), 'zdata' , GG1(1,J));
pause(0.1);
fop=getframe(gcf);
image(fop.cdata);
end
disp('现在程序已经结束了');
%画出最终极值点停留位置
[attach]3912[/attach]
展开阅读全文