MATLAB编写用数值微分法的梯度计算函数(函数式M文件)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值