f(x)=(x1+10x2)2+5(x3−x4)2+(x2−2x3)4+10(x1−x4)4
我们将这个函数实现为MATLAB代码,并使用FR共轭梯度法对其进行优化。首先需要定义目标函数及其梯度。然后,使用前面介绍的FR共轭梯度法进行优化。
目标函数和梯度的定义
我们需要先定义目标函数 f(x)f(x)f(x) 及其梯度 ∇f(x)\nabla f(x)∇f(x)。
1 function [x, fval, iter] = fr_cg(f, grad_f, x0, tol, max_iter) 2 % f: 待优化的目标函数句柄 3 % grad_f: 目标函数的梯度句柄 4 % x0: 初始点 5 % tol: 终止准则 6 % max_iter: 最大迭代次数 7 8 % 初始化 9 x = x0; 10 g = grad_f(x); 11 d = -g; 12 iter = 0; 13 14 while norm(g) > tol && iter < max_iter 15 % 计算步长alpha 16 alpha = line_search(f, grad_f, x, d); 17 18 % 更新x 19 x_new = x + alpha * d; 20 21 % 计算新的梯度 22 g_new = grad_f(x_new); 23 24 % 计算beta 25 beta = (g_new' * g_new) / (g' * g); 26 27 % 更新搜索方向 28 d = -g_new + beta * d; 29 30 % 更新x和g 31 x = x_new; 32 g = g_new; 33 34 % 增加迭代次数 35 iter = iter + 1; 36 end 37 38 fval = f(x); 39 end 40 41 function alpha = line_search(f, grad_f, x, d) 42 % 使用简单的线搜索方法来确定步长alpha 43 alpha = 1; 44 rho = 0.8; 45 c = 1e-4; 46 47 while f(x + alpha * d) > f(x) + c * alpha * grad_f(x)' * d 48 alpha = rho * alpha; 49 end 50 end
1 % 定义目标函数 2 f = @(x) (x(1) + 10 * x(2))^2 + 5 * (x(3) - x(4))^2 + (x(2) - 2 * x(3))^4 + 10 * (x(1) - x(4))^4; 3 4 % 定义目标函数的梯度 5 grad_f = @(x) [2 * (x(1) + 10 * x(2)) + 40 * (x(1) - x(4))^3; 6 20 * (x(1) + 10 * x(2)) + 4 * (x(2) - 2 * x(3))^3; 7 10 * (x(3) - x(4)) - 8 * (x(2) - 2 * x(3))^3; 8 -10 * (x(3) - x(4)) - 40 * (x(1) - x(4))^3]; 9 10 % 选取初始点 11 initial_points = [0, 0, 0, 0; 1, 1, 1, 1; -1, -1, -1, -1]; 12 13 % 设置终止准则和最大迭代次数 14 tol = 1e-6; 15 max_iter = 1000; 16 17 % 运行实验并输出结果 18 for i = 1:size(initial_points, 1) 19 x0 = initial_points(i, :)'; 20 [x, fval, iter] = fr_cg(f, grad_f, x0, tol, max_iter); 21 fprintf('初始点: (%.1f, %.1f, %.1f, %.1f)\n', x0(1), x0(2), x0(3), x0(4)); 22 fprintf('最优解: (%.6f, %.6f, %.6f, %.6f)\n', x(1), x(2), x(3), x(4)); 23 fprintf('最优值: %.6f\n', fval); 24 fprintf('迭代次数: %d\n', iter); 25 fprintf('-----------------------------\n'); 26 end
标签:10,%.,iter,2024,实验,alpha,数学,x0,grad From: https://www.cnblogs.com/Lyh3012648079/p/18232430