2024.6.5

实验四:共轭梯度法程序设计

一、实验目的

掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

二、实验内容

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

(2)终止准则取;

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

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

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

三、算法步骤、代码、及结果

1. 算法步骤

确定无约束优化问题:

给定目标函数$f(x)$,要求最小化或最大化该函数,即求解$\min f(x)$或$\max f(x)$。

选择终止准则:

确定终止准则,通常是设置一个收敛精度,当两次迭代之间目标函数值的差小于该精度时,认为算法已经收敛,可以终止迭代。

实现FR共轭梯度法的MATLAB编程:

编写MATLAB代码实现FR共轭梯度法,包括计算搜索方向、确定步长、更新迭代点等步骤。

选取初始点:

在实验二和实验三中选取的初始点作为起始点,用于FR共轭梯度法的初始迭代点。

执行共轭梯度法迭代:

使用FR共轭梯度法进行迭代优化,直到满足终止准则。

比较实验结果:

比较FR共轭梯度法与实验二和实验三中其他优化算法的实验结果,包括最优解、最优值和收敛速度等方面。

2. 代码

function [xk]=FR_Wolfe(e,x)

%step 1

g0=shuzhiweifenfa(x);

pk=-g0;

%没用到k,只存储当前迭代的值。

xk=x;

while 1

%step 2

%一维搜索求ak

a=Wolfe_Powell(xk,pk);

%step 3

xk=xk+a*pk;

g1=shuzhiweifenfa(xk);

%step 4

%范数用的是平方和开根号

if sqrt(sum(g1.^2))<=e

return;

end

%step 5

b=(g1*g1')/(g0*g0');

pk=-g1+b*pk;

%step 6

%没用到k,只存储当前迭代的值。

g0=g1;

function g=shuzhiweifenfa(x)

for i = 1:length(x)

m=zeros(1,length(x));

m(i)=(10^-6)/2;

g(i)=f(x+m)-f(x-m);

end

g=g/10^-6;

function a=Wolfe_Powell(x,pk)

%step 1

u=0.1;

b=0.5;

a=1;

n=0;

m=10^100;

%step 2

fx=f(x);

g=shuzhiweifenfa(x);

while 1

xk=x+a*pk;

fxk=f(xk);

gk=shuzhiweifenfa(xk);

if (fx-fxk)>=(-u*a*g*pk.')%(3-1)

if (gk*pk.')>=(b*g*pk.')%(3-2)

return;

 

else

%step 4

n=a;

a=min(2*a,(a+m)/2);

end

else

%step 3

m=a;

a=(a+n)/2;

end

end

 

3. 结果

 

四、心得体会

通过实现共轭梯度法,我深入理解了其算法原理,并体会到了编程中的挑战与乐趣。在编写代码的过程中,我学会了如何处理数值稳定性问题,并调整了算法参数以达到最佳效果。这次实验不仅锻炼了我的编程能力,还增强了我对优化算法的认识。我认识到共轭梯度法在求解大规模稀疏线性方程组时具有明显优势,但面对复杂问题时需要相应改进。

 

posted @ 2024-06-13 15:55  liuxuechao  阅读(7)  评论(0编辑  收藏  举报