【工程优化】最优化算法--牛顿法、阻尼牛顿法及单纯形法

简介: 牛顿法         使用条件:目标函数具有二阶导数,且海塞矩阵正定。         优缺点: 收敛速度快、计算量大、很依赖初始点的选择。

牛顿法

        使用条件目标函数具有二阶导数,且海塞矩阵正定。

        优缺点收敛速度快、计算量大、很依赖初始点的选择。

        算法的基本步骤:

            
            
            

        算法流程图:

          

阻尼牛顿法

         与牛顿法基本相同, 只是加入了一维精确搜索
   
        优缺点:改善了局部收敛性。

我们假设要求f=(x-1)*(x-1)+y*y的最小值,具体算法实现如下,只需要运行NTTest.m文件,其它函数文件放在同一目录下即可:

1、脚本文件NTTest.m
clear all
clc
 
syms x y
f=(x-1)*(x-1)+y*y;
var=[x y];
x0=[1 1];eps=0.000001;
 
disp('牛顿法:')
minNT(f,x0,var,eps)
 
disp('阻尼牛顿法:')
minMNT(f,x0,var,eps)

2、minNT.m
 function [x,minf]=minNT(f,x0,var,eps)
%目标函数:f
%初始点:x0
%自变量向量:var
%精度:eps
%目标函数取最小值时的自变量值:x;
%目标函数的最小值:minf
 
format long;
if nargin==3
    eps=1.0e-6;
end
tol=1;
syms L
% x0=transpose(x0);
while tol>eps %不满足精度要求          
    gradf=jacobian(f,var);      %梯度方向
    jacf=jacobian(gradf,var);   %雅克比矩阵
    v=Funval(gradf,var,x0);%梯度的数值解
    tol=norm(v);%计算梯度(即一阶导)的大小
    pv=Funval(jacf,var,x0);%二阶导的数值解
    p=-inv(pv)*transpose(v);    %搜索方向
    x1=x0+p';%进行迭代
    x0=x1;
end
 
x=x1;
minf=Funval(f,var,x);
format short;

3、minMNT.m
function [x,minf]=minMNT(f,x0,var,eps)
%目标函数:f
%初始点:x0
%自变量向量:var
%精度:eps
%目标函数取最小值时的自变量值:x;
%目标函数的最小值:minf
 
format long;
if nargin==3
    eps=1.0e-6;
end
tol=1;
syms L
% x0=transpose(x0);
while tol>eps %不满足精度要求          
    gradf=jacobian(f,var);      %梯度方向
    jacf=jacobian(gradf,var);   %雅克比矩阵
    v=Funval(gradf,var,x0);%梯度的数值解
    tol=norm(v);%计算梯度(即一阶导)的大小
    pv=Funval(jacf,var,x0);%二阶导的数值解
    p=-inv(pv)*transpose(v);    %搜索方向
    %%%%寻找最佳步长%%%
    y=x0+L*p';
    yf=Funval(f,var,y);
    [a,b]=minJT(yf,0,0.1);
    xm=minHJ(yf,a,b);           %黄金分割法进行一维搜索最佳步长
    x1=x0+xm*p';%进行迭代
    x0=x1;
 
end
 
x=double(x1);
minf=double(Funval(f,var,x));
format short;

4、minHJ.m

function [x,minf]=minHJ(f,a,b,eps)
%目标函数:f
%极值区间左端点:a
%极值区间右端点:b
%精度:eps
%目标函数取最小值时自变量的值:x
%目标函数所取的最小值:minf
 
format long;
if nargin==3
    eps=1.0e-6;
end
 
l=a+0.382*(b-a);            %试探点
u=a+0.618*(b-a);            %试探点
k=1;
tol=b-a;
 
while tol>eps&&k<100000
    fl=subs(f,findsym(f),l);        %试探点函数值
    fu=subs(f,findsym(f),u);        %试探点函数值
    if fl>fu
        a=1;                        %改变区间左端点
        l=u;
        u=a+0.618*(b-a);            %缩短搜索区间
    else
        b=u;                        %改变区间右端点
        u=l;
        l=a+0.382*(b-a);             %缩短搜索区间
    end
    k=k+1;
    tol=abs(b-a);
end
if k==100000
    disp('找不到最小值!');
    x=NaN;
    minf=NaN;
    return;
end
x=(a+b)/2;
minf=subs(f,findsym(f),x);
format short;

5、minJT.m

function [minx,maxx]=minJT(f,x0,h0,eps)
%目标函数:f
%初始点:x0
%初始步长:h0
%精度:eps
%目标函数取包含极值的区间左端点:minx
%目标函数取包含极值的区间右端点:maxx
 
format long
if nargin==3
    eps=1.0e-6;
end
 
x1=x0;
k=0;
h=h0;
while 1
    x4=x1+h;        %试探步
    k=k+1;
    f4=subs(f,findsym(f),x4);
    f1=subs(f,findsym(f),x1);
    if f4<f1
        x2=x1;
        x1=x4;
        f2=f1;
        f1=f4;
        h=2*h;      %加大步长
    else
        if k==1
            h=-h;   %方向搜索
            x2=x4;
            f2=f4;
        else
            x3=x2;
            x2=x1;
            x1=x4;
            break;
        end
    end
end
 
minx=min(x1,x3);
maxx=x1+x3-minx;
format short;


6、Funval.m
function fv=Funval(f,varvec,varval)
var=findsym(f);
varc=findsym(varvec);
s1=length(var);
s2=length(varc);
m=floor((s1-1)/3+1);
varv=zeros(1,m);
if s1~=s2
    for i=0:((s1-1)/3)
        k=findstr(varc,var(3*i+1));
        index=(k-1)/3;
        varv(i+1)=varval(index+1);
    end
    fv=subs(f,var,varv);
else
    fv=subs(f,varvec,varval);
end

运行结果如下图:

单纯形法

    单纯形法的理论还有点复杂,而本文主要针对算法的基本实现,因此,理论部分就此略过,详情可以参考网上的相关资料。 下面给出具体的实现:

    我们以具体实例来说明:


具体的Matlab实现如下:

1、脚本文件:
clear all
clc
% A=[2 2 1 0 0 0
%    1 2 0 1 0 0
%    4 0 0 0 1 0
%    0 4 0 0 0 1];
% c=[-2 -3 0 0 0 0];
% b=[12 8 16 12]';
% baseVector=[3 4 5 6];
 
A=[1 1 -2 1 0 0
   2 -1 4 0 1 0
   -1 2 -4 0 0 1];
c=[1 -2 1 0 0 0];
b=[12 8 4]';
baseVector=[4 5 6];
 
[x y]=ModifSimpleMthd(A,c,b,baseVector)

2、ModifSimpleMthd.m文件
function [x,minf]=ModifSimpleMthd(A,c,b,baseVector)
%约束矩阵:A
%目标函数系数向量:c
%约束右端向量:b
%初始基向量:baseVector
%目标函数取最小值时的自变量值:x
%目标函数的最小值:minf
 
 
sz=size(A);
nVia=sz(2);
n=sz(1);
xx=1:nVia;
nobase=zeros(1,1);
m=1;
 
if c>=0
    vr=find(c~=0,1,'last');
    rgv=inv(A(:,(nVia-n+1):nVia))*b;
    if rgv>=0
        x=zeros(1,vr);
        minf=0;
    else
        disp('不存在最优解');
        x=NaN;
        minf=NaN;
        return;
    end
end
 
for i=1:nVia            %获取非基变量下标
    if(isempty(find(baseVector==xx(i),1)))
        nobase(m)=i;
        m=m+1;
    else
        ;
    end
end
 
bCon=1;
M=0;
B=A(:,baseVector);
invB=inv(B);
 
while bCon
    nB=A(:,nobase);         %非基变量矩阵
    ncb=c(nobase);          %非基变量系数
    B=A(:,baseVector);      %基变量矩阵
    cb=c(baseVector);       %基变量系数
    xb=invB*b;
    f=cb*xb;
    w=cb*invB;
    
    for i=1:length(nobase)  %判别
        sigma(i)=w*nB(:,i)-ncb(i);
    end
    [maxs,ind]=max(sigma);  %ind为进基变量下标
    if maxs<=0              %最大值小于零,输出解最优
        minf=cb*xb;
        vr=find(c~=0,1,'last');
        for l=1:vr
            ele=find(baseVector==l,1);
            if(isempty(ele))
                x(l)=0;
            else
                x(l)=xb(ele);
            end
        end
        bCon=0;
    else
        y=inv(B)*A(:,nobase(ind));
        if y<=0             %不存在最优解
            disp('不存在最优解!');
            x=NaN;
            minf=NaN;
            return;
        else
            minb=inf;
            chagB=0;
            for j=1:length(y)
                if y(j)>0
                    bz=xb(j)/y(j);
                    if bz<minb
                        minb=bz;
                        chagB=j;
                    end
                end
            end                     %chagB为基变量下标
            tmp=baseVector(chagB);  %更新基矩阵和非基矩阵
            baseVector(chagB)=nobase(ind);
            nobase(ind)=tmp;
            
            for j=1:chagB-1         %基变量矩阵的逆矩阵变换
                if y(j)~=0
                    invB(j,:)=invB(j,:)-invB(chagB,:)*y(j)/y(chagB);
                end
            end
            for j=chagB+1:length(y)
                if y(j)~=0
                    invB(j,:)=invB(j,:)-invB(chagB,:)*y(j)/y(chagB);
                end
            end
            invB(chagB,:)=invB(chagB,:)/y(chagB);
            
        end
    end
    M=M+1;
    if(M==1000000)               %迭代步数限制
        disp('找不到最优解!');
        x=NaN;
        minf=NaN;
        return;
    end
end

 运行结果如下图:



关于最优化的更多算法实现,请访问 http://download.csdn.net/detail/tengweitw/8434549,里面有每个算法的索引说明,当然也包括上述算法。

作者:nineheadedbird

















目录
相关文章
|
14天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
146 80
|
2天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
4天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
50 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
7天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
10天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
11天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
14天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6
|
20天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
63 3
|
20天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
43 2
|
1月前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
159 15

热门文章

最新文章