工程數學實驗四

不会JAVA的小袁發表於2024-06-13

上機實驗四:共軛梯度法程式設計

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)]);

相關文章