1、MATLAB编写用数值微分法的梯度计算函数(函数式M文件) 2、MATLAB编写最速下降法求解无约束优化问题的函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式M文件,精度设为epson可调) ; 3、MATLAB编写最速下降法求解无约束优化问题的函数,要求采用Wolfe-Powell非精确一维搜索, 用数值微分法计算梯度(函数式M文件,精度设为epson可调) ; 4、MATLAB编写程序( 命令式M文件),分别利用精确搜索和不精确搜索的最速下降法,求解如下问题: min f(x)=100*(x2-x1^2)^2+(1-x1^2) 精度为0.001,初始点为(-1, 1) ; 改变初始点为(-1.2, 1)重新运行,观察运行结果。
1、MATLAB编写用数值微分法的梯度计算函数(函数式M文件):
function gradient = numerical_gradient(func, x, epsilon)
n = length(x);
gradient = zeros(n, 1);
for i = 1:n
x_plus = x;
x_plus(i) = x_plus(i) + epsilon;
x_minus = x;
x_minus(i) = x_minus(i) - epsilon;
gradient(i) = (func(x_plus) - func(x_minus)) / (2 * epsilon);
end
end
2、MATLAB编写最速下降法求解无约束优化问题的函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式M文件,精度设为epsilon可调):
function [x_min, f_min] = steepest_descent_golden(func, gradient_func, x0, epsilon)
alpha = 0.618; % 黄金分割法的参数
a = 0; % 搜索区间的左边界
b = 1; % 搜索区间的右边界
x = x0;
f_min = func(x);
while true
gradient = gradient_func(func, x, epsilon);
d = -gradient;
% 使用黄金分割法进行一维搜索
lambda1 = a + (1 - alpha) * (b - a);
lambda2 = a + alpha * (b - a);
f1 = func(x + lambda1 * d);
f2 = func(x + lambda2 * d);
if f1 < f2
b = lambda2;
x = x + lambda1 * d;
f_min = f1;
else
a = lambda1;
x = x + lambda2 * d;
f_min = f2;
end
if norm(gradient) < epsilon
break;
end
end
x_min = x;
end
3、MATLAB编写最速下降法求解无约束优化问题的函数,要求采用Wolfe-Powell非精确一维搜索,用数值微分法计算梯度(函数式M文件,精度设为epsilon可调):
function [x_min, f_min] = steepest_descent_wolfe(func, gradient_func, x0, epsilon)
c1 = 0.1; % Wolfe-Powell搜索的参数
c2 = 0.9; % Wolfe-Powell搜索的参数
x = x0;
f_min = func(x);
while true
gradient = gradient_func(func, x, epsilon);
d = -gradient;
% 使用Wolfe-Powell非精确一维搜索
lambda = 1;
alpha = 0;
beta = Inf;
while true
f0 = func(x);
f1 = func(x + lambda * d);
g0 = gradient' * d;
g1 = gradient_func(func, x + lambda * d, epsilon) * d;
if f1 > f0 + c1 * lambda * g0 || (f1 >= f0 && abs(g1) > -c2 * g0)
beta = lambda;
lambda = (alpha + beta) / 2;
else
if abs(g1) <= -c2 * g0
break;
end
if g1 * (beta - alpha) >= 0
beta = alpha;
end
alpha = lambda;
lambda = (alpha + beta) / 2;
end
end
x = x + lambda * d;
f_min = func(x);
if norm(gradient) < epsilon
break;
end
end
x_min = x;
end
4、MATLAB编写程序(命令式M文件),分别利用精确搜索和不精确搜索的最速下降法,求解如下问题: min f(x)=100*(x2-x1^2)^2+(1-x1^2) 精度为0.001,初始点为(-1, 1) ; 改变初始点为(-1.2, 1)重新运行,观察运行结果。
% 精确搜索的最速下降法
func = @(x) 100 * (x(2) - x(1)^2)^2 + (1 - x(1)^2);
gradient_func = @numerical_gradient;
x0 = [-1; 1];
epsilon = 0.001;
[x_min, f_min] = steepest_descent_golden(func, gradient_func, x0, epsilon);
disp("精确搜索的最速下降法结果:");
disp("最优解 x_min = ");
disp(x_min);
disp("最小值 f_min = ");
disp(f_min);
% 不精确搜索的最速下降法
[x_min, f_min] = steepest_descent_wolfe(func, gradient_func, x0, epsilon);
disp("不精确搜索的最速下降法结果:");
disp("最优解 x_min = ");
disp(x_min);
disp("最小值 f_min = ");
disp(f_min);
% 改变初始点为(-1.2, 1)重新运行
x0 = [-1.2; 1];
[x_min, f_min] = steepest_descent_golden(func, gradient_func, x0, epsilon);
disp("精确搜索的最速下降法结果(初始点为(-1.2, 1)):");
disp("最优解 x_min = ");
disp(x_min);
disp("最小值 f_min = ");
disp(f_min);
[x_min, f_min] = steepest_descent_wolfe(func, gradient_func, x0, epsilon);
disp("不精确搜索的最速下降法结果(初始点为(-1.2, 1)):");
disp("最优解 x_min = ");
disp(x_min);
disp("最小值 f_min = ");
disp(f_min);