Matlab学习手记——牛顿型信頼域法求解无约束问题

牛顿型信赖域方法求解无约束问题:  min f(x)。

function x = Opt_TrustRegionNewton(x0, err, MaxIter)
%{
函数功能:牛顿型信赖域方法求解无约束问题:  min f(x);
输入:
  x0:初始点;
  err:梯度误差阈值;
  MaxIter:最大迭代次数;
输出:
  x:最小值点;
调用格式:
clear; clc;
x = Opt_TrustRegionNewton([0 0]', 1e-5, 1000)
%}
if nargin < 3
   MaxIter = 10000;
end
if nargin < 2
   err = 1e-5;
end
if nargin < 1
   error('输入参数不足!');
end
eta1 = 0.1;  
eta2 = 0.75;
tau1 = 0.5;  
tau2 = 2.0;
delta = 1; 
dtabar = 2.0;
x = x0;
Bk = Hess(x);
k = 0;
while k < MaxIter 
    fk = fun(x);
    gk = gfun(x);
    if norm(gk) < err 
        break;
    end
    % 调用子程序 Trust_q
    [d, val] = Trust_q(fk, gk, Bk, delta);
    dq = fk - val;
    df = fun(x) - fun(x + d);
    rk = df/dq;
    if rk <= eta1 
        delta = tau1*delta;
    elseif rk >= eta2 && norm(d) == delta 
            delta = min(tau2*delta, dtabar);
    end
    if rk > eta1 
        x = x + d;
        Bk = Hess(x);
    end
    k = k+1;
end

function [d, val] = Trust_q(fk, gk, Bk, deltak)
%{
  函数功能: 求解信赖域子问题:
          min qk(d)=fk+gk'*d+0.5*d'*Bk*d, s.t.||d|| <= delta
输入: 
  fk:xk处的目标函数值;
  gk:xk处的梯度;
  Bk:近似Hesse阵;
  delta:当前信赖域半径
输出: 
  d:最优值;
  val:最优值
%}
n = length(gk);
beta = 0.6;
sigma = 0.2;
mu0 = 0.05;
lam0 = 0.05;
gamma = 0.05;
d0 = ones(n, 1);
zbar = [mu0, zeros(1, n + 1)]';
i = 0;
mu = mu0;
lam = lam0;
d = d0;
while i <= 150
    H = dah(mu, lam, d, gk, Bk, deltak);
    if norm(H) <= 1e-8
        break;
    end
    J = JacobiH(mu, lam, d, Bk, deltak);
    b = psi(mu, lam, d, gk, Bk, deltak, gamma)*zbar - H;
    dz = J\b;
    dmu = dz(1); 
    dlam = dz(2); 
    dd = dz(3 : n + 2);
    m = 0; 
    mi = 0;
    while m < 20
        t1 = beta^m;
        Hnew = dah(mu + t1*dmu, lam + t1*dlam, d + t1*dd, gk, Bk, deltak);
        if norm(Hnew) <= (1 - sigma*(1 - gamma*mu0)*beta^m)*norm(H) 
            mi = m; 
            break;
        end
        m = m+1;
    end
    alpha = beta^mi;
    mu = mu + alpha*dmu;
    lam = lam + alpha*dlam;
    d = d + alpha*dd;
    i = i + 1;
end
val = fk + gk'*d + 0.5*d'*Bk*d;

function p = phi(mu, a, b)
p = a + b - sqrt((a - b)^2 + 4*mu^2);

function H = dah(mu, lam, d, gk, Bk, deltak)
n = length(d);
H = zeros(n + 2, 1);
H(1) = mu;
H(2) = phi(mu, lam, deltak^2 - norm(d)^2);
H(3 : n + 2) = (Bk + lam*eye(n))*d + gk;

function J = JacobiH(mu, lam, d, Bk, deltak)
n = length(d);
t2 = sqrt((lam + norm(d)^2 - deltak^2)^2 + 4*mu^2);
pmu = -4*mu/t2;
thetak = (lam + norm(d)^2 - deltak^2)/t2;
J=[1,                0,               zeros(1, n);
    pmu,            1 - thetak,  -2*(1 + thetak)*d';
    zeros(n, 1),  d,               Bk + lam*eye(n)];

function si = psi(mu, lam, d, gk, Bk, deltak, gamma)
H = dah(mu, lam, d, gk, Bk, deltak);
si = gamma*norm(H)*min(1, norm(H));

function f = fun(x)
f = 100*(x(1)^2 - x(2))^2 + (x(1) - 1)^2;

function gf = gfun(x)
gf = [400*x(1)*(x(1)^2 - x(2)) + 2*(x(1) - 1);
         -200*(x(1)^2 - x(2))];

function He = Hess(x)
He = [400*(3*x(1)^2 - x(2)) + 2,  -400*x(1);
          -400*x(1),                            200];

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一份MATLAB实现的程序: ```matlab function [xopt, fopt, iter] = trust_region(f, g, H, x0, delta, tol, itmax) % TRUST_REGION Trust region algorithm for unconstrained optimization % [XOPT, FOPT, ITER] = TRUST_REGION(F, G, H, X0, DELTA, TOL, ITMAX) % finds a local minimizer of the function F using the trust region % method with initial point X0, trust region radius DELTA, and tolerance % TOL. The maximum number of iterations is ITMAX. The gradient of F % is given by G and the Hessian matrix of F is given by H. % % XOPT is the optimal point, FOPT is the optimal function value, and % ITER is the number of iterations until convergence. % Initialization x = x0; fval = f(x); gval = g(x); Hval = H(x); iter = 0; % Main loop while norm(gval) > tol && iter < itmax % Solve trust region subproblem p = trust_region_subproblem(gval, Hval, delta); xnew = x + p; fnew = f(xnew); actual_reduction = fval - fnew; predicted_reduction = -gval' * p - 0.5 * p' * Hval * p; rho = actual_reduction / predicted_reduction; % Update trust region radius if rho < 0.25 delta = 0.25 * delta; elseif rho > 0.75 && norm(p) == delta delta = min(2 * delta, 1e10); end % Update x, fval, gval, Hval if rho > 0 x = xnew; fval = fnew; gval = g(x); Hval = H(x); end iter = iter + 1; end xopt = x; fopt = fval; end function p = trust_region_subproblem(g, H, delta) % TRUST_REGION_SUBPROBLEM Solve the trust region subproblem % P = TRUST_REGION_SUBPROBLEM(G, H, DELTA) solves the trust region % subproblem for a given gradient G, Hessian matrix H, and trust region % radius DELTA. The solution P is the minimizer of the quadratic model % m(p) = g'p + 0.5 * p'Hp subject to ||p|| <= DELTA. % Solve unconstrained subproblem p = -H \ g; % Calculate norm of p pnorm = norm(p); % Check if p satisfies trust region constraint if pnorm <= delta return; end % Solve constrained subproblem p = -((g' * p) / (p' * H * p)) * p + sqrt(delta^2 - pnorm^2) * (p / pnorm); end ``` 在此程序中,我们首先定义了`trust_region`函数,该函数使用来最小化给定的函数。输入参数包括函数本身,函数的梯度和黑塞矩阵,初始点,半径,收敛容差和最大迭代次数。输出参数是最优点,最优函数值和迭代次数。 该程序的主要部分是`while`循环,该循环持续进行直到梯度的范数小于收敛容差或达到最大迭代次数。在每次迭代中,我们首先解决问题,然后根据实际和预测的减少率更新半径。最后,我们更新$x$,$f$值,梯度和黑塞矩阵,并增加迭代计数器。 问题由`trust_region_subproblem`函数解决。该函数首先求解约束问题,然后检查$p$是否满足约束。如果不是,则求解约束问题。 此程序仅为的一个基本实现。根据应用程序的具体要求,可能需要进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值