上機實驗四:共軛梯度法程式設計
1、基本要求
掌握共軛梯度法的基本思想及其迭代步驟;學會運用MATLAB程式設計實現常用最佳化演算法;能夠正確處理實驗資料和分析實驗結果及除錯程式。
2、主要內容
(1)求解無約束最佳化問題:
(2)終止準則取;
(3)完成FR共軛梯度法的MATLAB程式設計、除錯;
(4)選取幾個與實驗二實驗三中相同的初始點,並給出相關實驗結果的對比及分析(從最優解、最優值、收斂速度(迭代次數)等方面進行比較);
(5)按照模板撰寫實驗報告,要求規範整潔。
3、操作要點
(1)透過程式設計實現FR共軛梯度法;
(2)使用MTALAB除錯程式,並將實驗結果儲存到檔案中;
(3)撰寫實驗報告。
4、主要儀器裝置
微機及Matlab軟體
FR:
function [x, iter] = FR(func, x0, tol, max_iter)
% func - Ŀ�꺯�����ַ�����ʾ���� 'x1^2 + 10*x2^2'
% x0 - ��ʼ�㣬������
% tol - ����Ҫ���ݶȵ�ģ��
% max_iter - ����������
n = length(x0);
vars = sym('x', [1 n]); % ��̬�������ű�������
% ����Ŀ�꺯��
funf_sym = str2sym(func);
% �����ݶȺ�Hessian����
gradf_sym = gradient(funf_sym, vars);
hessf_sym = hessian(funf_sym, vars);
% �����ű���ʽת��Ϊ�������
funf = matlabFunction(funf_sym, 'Vars', {vars.'});
gradf = matlabFunction(gradf_sym, 'Vars', {vars.'});
hessf = matlabFunction(hessf_sym, 'Vars', {vars.'});
x = x0;
g = gradf(x);
d = -g;
k = 0;
while norm(g) > tol && k < max_iter
% ʹ�� Hessian ���� * d
Hd = hessf(x) * d;
alpha = -(g' * d) / (d' * Hd);
% ���� x
x = x + alpha * d;
% �����µ��ݶ�
g_new = gradf(x);
% Fletcher-Reeves ��ʽ
beta = (g_new' * g_new) / (g' * g);
% ���� d
d = -g_new + beta * d;
% ���¾ɵ��ݶ�
g = g_new;
k = k + 1;
end
iter = k;
end
FR_run:
% ����Ŀ�꺯��
func = '(x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4';
% ��ʼ��
x0 = [2; 2; 2; 2];
% ����
tol = 1e-6;
% ����������
max_iter = 1000;
% �����Ż�����
[x, iter] = FR(func, x0, tol, max_iter);
% ������
disp('Optimal solution x:');
disp(x);
disp(['Number of iterations: ', num2str(iter)]);