2024.6.15

所学时间:3小时

代码行数:120

博客园数:1

所学知识:今天学习了工程数学的实验四共轭梯度法程序设计。

 

1)求解无约束优化问题:

 

2)终止准则取

 

3)完成FR共轭梯度法MATLAB编程、调试;

 

(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

 

5)按照模板撰写实验报告,要求规范整洁。

 

1. 算法步骤 

 

 

 

(1)设置初始条件和参数。

 

(2)初始化变量并计算初始梯度。

 

(3)进行迭代,直到满足停止条件(达到最大迭代次数或梯度范数低于阈值)。

 

(4)更新搜索方向和步长。

 

(5)计算新的迭代点和梯度。

 

(6)更新下一次迭代的共轭方向。

 

(7)检查停止条件,并在满足时退出循环。

 

(8)输出迭代次数、近似最优点和近似最优值。

 

2. 代码

 

function [k,x,val]=linecg(A,b,x0,ep,N)

 

%设置初始条件

 

if(nargin<5),N=1000;end

 

if(nargin<4),ep=1e-5;end;

 

if(nargin<3),x0=zeros(length(b),1);end

 

k=0;

 

ep=1e-6;

 

gk=feval(b,x0)

 

dk=-gk

 

     

 

while(k<N)

 

     temp=feval(A,x0)*dk;

 

     alpha=-dk'*gk/(dk'*temp);

 

     x=x0+alpha*dk;

 

     gk=feval(b,x);

 

     betak=gk'*temp/(dk'*temp);

 

     dk=-gk+betak*dk;

 

     if(norm(gk)<ep)

 

         break;

 

     end

 

     x0=x;

 

     k=k+1;

 

end

 

disp('迭代次数:')

 

k

 

disp('近似最优点:')

 

x0

 

disp('近似最优值:')

 

val=0.5*x0'*feval(A,x0)*x0-feval(b,x0)'*x0

 

End

 

 

 

x0=[1;1;1;1];

 

[k,x,val]=linecg('ggfun','gfun',x0,1e-6,5000);

 

 

 

function  gg=ggfun(x)

 

%目标函数的二阶矩阵

 

gg=[2+120*(x(1)-x(4))^2, 20, 0, -120*(x(1)-x(4))^2;

 

    20, 200+12*(x(2)-2*x(3))^2, -24*(x(2)-2*x(3))^2, 0;

 

    0, -24*(x(2)-2*x(3))^2, 10+48*(x(2)-2*x(3))^2, -10;

 

    -120*(x(1)-x(4))^2, 0, -10, 10+120*(x(1)-x(4))^2];

 

End

 

 

 

function  g=gfun(x)

 

%目标函数的梯度

 

g=[2*(x(1)+10*x(2))+40*(x(1)-x(4))^3;

 

    20*(x(1)+10*x(2))+4*(x(2)-2*x(3))^3;

 

    10*(x(3)-x(4))-8*(x(2)-2*x(3))^3;

 

    -10*(x(3)-x(4))-40*(x(1)-x(4))^3];

 

end

 

posted @ 2024-06-15 00:00  kuku睡  阅读(6)  评论(0编辑  收藏  举报