罚函数法——外点罚函数法

罚函数法——外点罚函数法

  • 外点罚函数法
    • 算法
    • 算例
    • matlab代码
    • 测试文件
    • 输出结果

外点罚函数法

算法

罚函数法——外点罚函数法_第1张图片

算例

罚函数法——外点罚函数法_第2张图片

matlab代码

function [x,val]=waidian1(x0,epsilon)
m(1)=1;
c=10;% c为递增系数
for k=1:100
    e=m(k);
    x0=bfgs('zg','dzg',x0);
    f=zg(x0,e);
    if(f<=epsilon)
        break
    else
        m(k+1)=c*m(k);
    end
end
x=x0;
val=mbf(x0);
function f=zg(x,e)
f=log(1+x(1)^2)-x(2)+e*((1+x(1)^2)^2+x(2)^2-4)^2; % 构造罚函数
function df=dzg(x,e)
df=[2*x(1)/(1+x(1)^2)+e*8*x(1)*(1+x(1)^2)*((1+x(1)^2)^2+x(2)^2-4);-1+e*4*x(2)*((1+x(1)^2)^2+x(2)^2-4)];
function[k,x,val]=bfgs(fun,gfun,x0,varargin)
N=1000;
epsilon=1.e-5;
beta=0.55;
sigma=0.4;
n=length(x0);
Bk=eye(n);
k=0;
while(k<N)
    gk=feval(gfun,x0,varargin{:});
    if(norm(gk)<epsilon)
        break;
    end
    dk=-Bk\gk;
    m=0;
    mk=0;
    while(m<20)
        newf=feval(fun,x0+beta^m*dk,varargin{:});
        oldf=feval(fun,x0,varargin{:});
        if(newf<=oldf+sigma*beta^m*gk'*dk)
            mk=m;
            break;
        end
        m=m+1;
    end
    x=x0+beta^mk*dk;
    sk=x-x0;
    yk=feval(gfun,x,varargin{:})-gk;
    if(yk'*sk>0)
        Bk=Bk-(Bk*(sk*sk')*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk);
    end
    k=k+1;
    x0=x;
end
val=feval(fun,x0,varargin{:});

测试文件

clear;
clc;
x0=[2,2];
epsilon=1e-4;
[x,val]=waidian1(x0,epsilon)

输出结果

罚函数法——外点罚函数法_第3张图片
我不知道为啥会报错,是应该可以这么编程的吧,希望有大佬可以指导一下。

你可能感兴趣的:(#,最优化方法)