2024/6/5 工程数学 实验四

f(x)=(x1+10x2)2+5(x3x4)2+(x22x3)4+10(x1x4)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
复制代码

 

posted @   新晋软工小白  阅读(10)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示