【优化设计基础】

本资源仅供学习交流,严禁用于其它用途!



一、 overview of optimization


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


二、 MATLAB basis for optimization calculation


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


三、 Mathematical basis for optimization calculation


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

syms x1 x2 %定义符号变量x1 x2
var=[x1,x2]; %定义变量
fun=x1^2+x2^2-4*x1+4; %定义目标函数
disp('梯度表达式为:');
gra_exp=jacobian(fun,var).' %梯度表达式,列向量形式
X1=[3,1];
disp('X1点处梯度为:');
gra_val=subs(gra_exp,var,X1) %求点X1处的梯度值

eval () %符号变量转为数值变量

在这里插入图片描述


在这里插入图片描述

syms x1 x2
var=[x1,x2];
fun=x1^3-x2^3+3*x1^2+3*x2^2-9*x1;
disp('函数的二阶泰勒展开式为:');
taylor(fun,var,[1,1],'order',3) %求函数fun在点(1,1)处的二阶泰勒展开式


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

syms x1 x2
var=[x1,x2];
fun=x1^3+x2^3-3*x1-3*x2^2;
gra_exp=jacobian(fun,var).'; %梯度表达式,列向量形式
H_exp=jacobian(gra_exp,var); %海塞矩阵表达式
dx1=gra_exp(1,1); 
dx2=gra_exp(2,1);
[x,y]=solve(dx1,dx2,x1,x2); %求梯度为0对应的点
disp('梯度为零的点为:');
X=[x,y]
for i=1:4
H_val=subs(H_exp,var,X(i,:))
[D,p]=chol(H_val)
if p==0
    disp('极小值点为:')
    X_opti= X(i,:)
    disp('函数极小值为:')
    minf=subs(fun,var,X(i,:))
    break
end
end

在这里插入图片描述


在这里插入图片描述

syms x1 x2 lam
var=[x1,x2,lam];
fun=x1^2+x2^2-4;
h=x1-x2+2;
Fun=fun+lam*h;
gra_exp=jacobian(Fun,var).'; %梯度表达式,列向量形式
dx1=gra_exp(1,1); 
dx2=gra_exp(2,1);
dlam=gra_exp(3,1);
[x1,x2,lam]=solve(dx1,dx2,dlam,x1,x2,lam); %求梯度为0的点
disp('极值点坐标为:');
X_opti=[x1,x2]

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


四、 One-dimensional optimization


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


function[a,b]=ARM(f,x0,h0)
%ARM.m Advance&Retreat Method(进退法:求一维搜索的初始搜索区间),函数调用格式为[a,b]=ARM(f,x0,h0)
%a:初始搜索区间的下限(输出)
%b:初始搜索区间的上限(输出)
%f:一维目标函数(输入)
%x0:初始点(输入)
%h0:初始步长(输入)
 
x1=x0;
f1=eval(subs(f,findsym(f),x1));
h=h0;
x2=x1+h;
f2=eval(subs(f,findsym(f),x2)); 
if f1>=f2 
    while 1 %1为真
        x3=x2+h;
        f3=eval(subs(f,findsym(f),x3)); 
        if f2>f3
            x1=x2;
            x2=x3;
            f2=f3;
            h=2*h; 
        else
            a=x1;
            b=x3;
        break; 
        end
    end
else %反向搜索
    x3=x2;
    x2=x1;
    f2=f1;
    while 1
        x1=x2-h;
        f1=eval(subs(f,findsym(f),x1));
        if f2>f1
            x3=x2;
            x2=x1;
            f2=f1;
            h=2*h;
        else
            a=x1;
            b=x3;
        break;
        end
    end
end
format compact,format short; 

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


function[x_opti]=GSM(f,x0,h0,eps)
%GSM.m Golden Section Method(黄金分割法:求一维函数极小值点),调用格式[x_opti]=GSM(f,x0,h0,eps)
%x_opti:一维搜索极小值点(输出)
%f:一维目标函数(输入)
%x0:进退法初始点(输入)
%h0:进退法初始步长(输入)
%eps:收敛精度

golden_ratio=(sqrt(5)-1)/2; 
[a,b]=ARM(f,x0,h0); 
a1=b-golden_ratio*(b-a); 
a2=a+golden_ratio*(b-a);
k=0;
while 1
    f1=eval(subs(f,findsym(f),a1)); 
    f2=eval(subs(f,findsym(f),a2)); 
    if f1>=f2
        a=a1; 
        a1=a2;
        a2=a+golden_ratio*(b-a); 
    else
        b=a2; 
        a2=a1;
        a1=b-golden_ratio*(b-a); 
    end
    k=k+1;
    fa=eval(subs(f,findsym(f),a)); 
    fb=eval(subs(f,findsym(f),b)); 
    C1=b-a; 
    C2=abs(fa-fb);
if C1<eps&&C2<eps 
        break
    end
end
x_opti=(a+b)/2; 

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


function[x_opti]=PM(f,x0,h0,eps)
%PM.m Parabolic Method(抛物线法:求一维函数极小值点),调用格式[x_opti]=PM(f,x0,h0,eps)
%x_opti:一维搜索极小值点(输出)
%f:一维目标函数(输入)
%x0:进退法初始点(输入)
%h0:进退法初始步长(输入)
%eps:收敛精度(输入)
 
[a,b]=ARM(f,x0,h0); 
a2=(a+b)/2; 
k=1;
while 1
    fa=eval(subs(f,findsym(f),a)); 
    fb=eval(subs(f,findsym(f),b)); 
    fa2=eval(subs(f,findsym(f),a2)); 
    c1=fa*(a2^2-b^2)+fa2*(b^2-a^2)+fb*(a^2-a2^2);
    c2=fa*(a2-b)+fa2*(b-a)+fb*(a-a2);
    ap=c1/2/c2; 
    fap=eval(subs(f,findsym(f),ap)); 
    C=abs(ap-a2); 
    if C<eps 
        break
    end
    if fap<=fa2 
        if ap<=a2
            b=a2;
            a2=ap;
        else
            a=a2;
            a2=ap;
        end
else
       if ap<=a2
           a=ap;
       else
           b=ap;
       end
    end
    k=k+1;
end
x_opti=ap; 

在这里插入图片描述


在这里插入图片描述


function[x_opti]=NM(f,x0,eps)
%NM.m Newton Method(牛顿法:求一维函数极小值点),调用格式[x_opti]=NM(f,x0,eps)
%x_opti:一维搜索极小值点(输出)
%f:一维目标函数(输入)
%x0:初始点(输入)
%eps:收敛精度(输入)
 
df_exp=diff(f); 
ddf_exp=diff(df_exp); 
k=0;
while 1
    df_val=eval(subs(df_exp,findsym(df_exp),x0)); 
    C=abs(df_val); 
    if C<eps 
        break
    end
    ddf_val=eval(subs(ddf_exp,findsym(ddf_exp),x0)); 
    x1=x0-df_val/ddf_val; %求迭代点x1
    k=k+1;
    x0=x1;
end
x_opti=x0; 

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


五、 Unconstrained optimization


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


六、 Constrained optimization


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


上机实践


最速下降法

function[X_opti,Fun_opti,K,Date]=SDM(Fun,X0,eps)
%SDM.m Steepest Descent Method(最速下降法:求多维无约束优化问题的极小值),调用格式[X_opti,Fun_opti,K,Date]=SDM(Fun,X0,eps)
%X_opti:极小值点(输出)
%Fun_opti:极小值点处的函数值(输出)
%K:迭代轮次(输出)
%Date:迭代中的主要数据(输出)
%Fun:目标函数(输入),命令窗口中输入格式为:syms x1 x2;Fun=x1^2+25*x2^2
%X0:初始点(输入),命令窗口中输入格式:X0=[2,2]
%eps:收敛精度(输入)

format compact; 
format short; 
n=length(X0); 
Var=sym('x',[1,n]); 
Date=zeros(500,n+2); 
Grad_exp=jacobian(Fun,Var); 
k=0; 
syms Iter_step; 
Fun_X0=eval(subs(Fun,findsym(Fun),X0));
Grad_X0=subs(Grad_exp,Var,X0);
Date(k+1,1:n+2)=[k,X0,Fun_X0]; 
Crit=eval(norm(Grad_X0)); 
if Crit<eps 
    X_opti=X0;
    Fun_opti=Fun_X0;
    K=k;
    Date(k+2:500,:)=[]; 
    str='输入点为目标函数的极小值点,极小值点X_opti、极小值Fun_opti及迭代轮次K分别为:';
    disp(str)
end
while Crit>=eps 
    Fun_X0=eval(subs(Fun,findsym(Fun),X0)); 
    d=-subs(Grad_exp,Var,X0); 
    X1_exp=X0+d*Iter_step; 
    fun=subs(Fun,Var,X1_exp); 
    [Step_opti]=GSM(fun,0,0.5,0.0001); 
    X1=eval(subs(X1_exp,Step_opti)); 
    Fun_X1=eval(subs(Fun,findsym(Fun),X1)); 
    k=k+1;
    Date(k+1,:)=[k,X1,Fun_X1]; 
    Grad_X1=subs(Grad_exp,Var,X1); 
    Crit1=eval(norm(Grad_X1)); 
    Crit2=abs(Fun_X1-Fun_X0); 
    if Crit1<eps||Crit2<eps 
        X_opti=X1;
        Fun_opti=Fun_X1;
        K=k;
        Date(k+2:500,:)=[]; %
        str='目标函数的极小值点X_opti、极小值Fun_opti、迭代轮次K及迭代中的主要数据分别为:';
        disp(str)
        break;
    end
    X0=X1; 
    if k>500 
        break
    end
end

随机方向法

function[X_opti,Fun_opti,K,Date]=RDM(Fun,X0,g,j,step0,eps)
%RDM.m Random Direction Method(随机方向法:求多维不等式约束优化问题的极小值),调用格式[X_opti,Fun_opti,K,Date]=RDM(Fun,X0,g,j,step0,eps)
%X_opti:极小值点(输出)
%Fun_opti:极小值点处的函数值(输出)
%K:迭代轮次(输出)
%Date:迭代中的主要数据(输出)
%Fun:目标函数(输入)
%X0:初始点(输入)
%g:不等式约束(输入),格式小于等于零
%j:随机点个数(输入)
%step0:初始步长(输入)
%eps:收敛精度(输入)


format compact; 
format short; 
n=length(X0); 
Var=sym('x',[1,n]); 
m=length(g); 
X_val=zeros(j,n); 
F_val=zeros(j,1); 
g_val=ones(j,m); 
Date=zeros(500,n+2); 
g_X0=subs(g,Var,X0); 
if length(g_X0(g_X0<=0))~=m  
    str='初始点不可行,请更换初始点';
    disp(str)
end
k=0;
kmax=0; 
i=1;
Fun_X0=eval(subs(Fun,symvar(Fun),X0)); 
Date(k+1,1:n+2)=[k,X0,Fun_X0]; 
while 1
    Fun_X0=eval(subs(Fun,symvar(Fun),X0)); 
    while i<=j 
        r=2*rand(1,n)-1; 
        d=(sum(r.^2).^(-0.5)).*r; 
        X_val(i,:)=X0+step0*d;
        F_val(i,:)=eval(subs(Fun,symvar(Fun),X_val(i,:)));
        g_val(i,:)=subs(g,Var,X_val(i,:));
        kmax=kmax+1;
        if length(g_val(g_val(i,:)<=0))~=m 
            if kmax>=10
                step0=0.5*step0;
            end
            continue
        end
        i=i+1;
    end
    i=1;
    [sortF,index]=sort(F_val); 
    sortX=X_val(index,:); 
    Fun_XL=sortF(1,:); 
    XL=sortX(1,:); 
    if Fun_XL>=Fun_X0 
        step0=0.5*step0; 
        continue
    end
    step1=1.3;
    X1=XL+step1*(XL-X0); 
    g_X1=subs(g,Var,X1); 
    while length(g_X1(g_X1<=0))~=m
        step1=0.5*step1;
        X1=XL+step1*(XL-X0);
        g_X1=subs(g,Var,X1);
    end
    Fun_X1=eval(subs(Fun,symvar(Fun),X1));
    while Fun_X1>=Fun_XL 
        step1=0.5*step1;
        X1=XL+step1*(XL-X0);
        Fun_X1=eval(subs(Fun,symvar(Fun),X1));
    end
    k=k+1;
    X0=X1;
    Date(k+1,:)=[k,X1,Fun_X1]; 
    Crit=abs(Fun_X1-Fun_X0); 
    if Crit<eps 
        X_opti=X1;
        Fun_opti=Fun_X1;
        K=k;
        Date(k+2:500,:)=[]; 
        str='优化问题的极小值点X_opti、极小值Fun_opti、迭代轮次K及迭代中的主要数据分别为:';
        disp(str)
        break;
    end
    if k>=100 
        break
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr.LZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值