matlab无约束最优化的一般算法流程图及代码(进退法,Fibonacci,黄金分割法,抛物线法)

本文探讨了进退法、Fibonacci搜索、黄金分割法和抛物线法四种数值逼近算法的实现流程及其在函数最小化中的应用,通过实例展示了如何使用这些方法寻找函数fx=x^4-4x^3-6x^2-16x+4的极小值。
摘要由CSDN通过智能技术生成

本实验中函数用单独function计算

%函数[fx]=f(x)
function fx=f(x)
fx=x.^4-4*x.^3-6*x.^2-16*x+4;

一,进退法,Fibonacci,黄金分割法,抛物线法流程图及代码

(一)、进退法

%进退法[a_left,c_middle,b_right]=jintuifa(x0,h)
function  [a_left,c_middle,b_right]=jintuifa(x0,h)
a_left=0;
c_middle=0;
b_right=0;
%step1
fx0=f(x0);
%step2
x1=x0+h;
fx1=f(x1);
if(fx1<=fx0)
    while(1)
        %step3
        h=2*h;
        if(h>100000000)
            fprint('算法失效');
            return;
        end
        x2=x1+h;
        fx2=f(x2);
        if(fx1<=fx2)
            a_left=x0;
            c_middle=x1;
            b_right=x2;
            return
        end
        %step4
        x0=x1;
        x1=x2;
        fx0=fx1;
        fx1=fx2;
    end
else
    while(1)
        %step5
        h=2*h;
        if(h>100000000)
            fprint('算法失效');
            return;
        end
        x2=x0-h;
        fx2=f(x2);
        if(fx0<=fx2)
            a_left=x2;
            c_middle=x0;
            b_right=x1;
            return
        end
        %step6
        x1=x0;
        x0=x2;
        fx1=fx0;
        fx0=fx2;
    end
end

(二)、Fibonacci法

1.流程图

2.代码

%x=Fibonacci(a,b,e)
function x=Fibonacci(a,b,e)
x=0;
%step1
c=(b-a)/e;
n=2;
F=[1 1];
while(1)
    %step2
    n=n+1;
    F=[F F(n-1)+F(n-2)];
    %step3
    if  F(n)>=c
        break;
    end
end
%step4
k=1;
x1=a+(F(n-2)/F(n))*(b-a);
x2=a+(F(n-1)/F(n))*(b-a);
f1=f(x1);
f2=f(x2);
%step5
while(1)
    if(f1<f2)
        b=x2;
        x2=x1;
        f2=f1;
        x1=a+(F(n-k-2)/F(n-k))*(b-a);
        f1=f(x1);
    else
       a=x1;
       x1=x2;
       f1=f2;
       x2=a+(F(n-k-1)/F(n-k))*(b-a);
       f2=f(x2);
    end
    %step6
    k=k+1;
    if k>=n-2
        break;
    end
end
%step7
if(f1<f2)
    b=x2;
    x2=x1;
    f2=f1;
else
    a=x1;
end
%step8
x1=x2-0.1*(b-a);
f1=f(x1);
if f1<f2
    x=(a+x2)/2;
else
    if f1<=f2
        x=(x1+x2)/2;
    else
        x=(x1+b)/2;
    end
end

(三)、黄金分割法

1.流程图

 2.代码

%x=huangjinfenge(a,b,e)
function x=huangjinfenge(a,b,e)
c=1;
%step1
while(c)
    c=0;
    x1=a+0.382*(b-a);
    f1=f(x1);
    x2=a+0.618*(b-a);
    f2=f(x2);
    while(1)
        %step2
        if(abs(b-a)<=e)
            x=(a+b)/2;
            return;
        end
        %step3
        if(f1<f2)
            b=x2;
            x2=x1;
            f2=f1;
            x1=a+0.382*(b-a);
            f1=f(x1);
        else
            if(f1<=f2)
                a=x1;
                b=x2;
                c=1;
                break;
            else
                a=x1;
                x1=x2;
                f1=f2;
                x2=a+0.618*(b-a);
                f2=f(x2);
            end
        end
    end
end

(四)、抛物线法

1.流程图

 2.代码

%x=paowuxian(x1,x0,x2,e1,e2)
function x=paowuxian(x1,x0,x2,e1,e2)
f0=f(x0);
f1=f(x1);
f2=f(x2);
while(1)
    %step1
    if(abs(x1-x2)<=e1)
        x=x0;%step10
        return;
    end
    %step2
    if(abs((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2)<=e2)
        x=x0;%step10
        return;
    end
    %step3
    x_=1/2*((x2*x2-x0*x0)*f1+(x1*x1-x2*x2)*f0+(x0*x0-x1*x1)*f2)/((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2);
    f_=f(x_);
    %step4
    if (f0-f_)>0
        %step5
        if(x0>x_)
            x2=x0;
            x0=x_;
            f2=f0;
            f0=f_;
        else
            x1=x0;
            x0=x_;
            f1=f0;
            f0=f_;
        end
    else
        if((f0-f_)<0)
            %step6
            if(x0<x_)
                x2=x_;
                f2=f_;
            else
                x1=x_;
                f1=f_;
            end
        else
            %step7
            if(x0<x_)
                x1=x0;
                x2=x_;
                x0=1/2*(x1+x2);
                f1=f0;
                f2=f_;
                f0=f(x0);
            else
                if(x0<=x_)
                    %step8
                    xv=1/2*(x1+x0);
                    fv=f(xv);
                    if(fv<f0)
                        x2=x0;
                        x0=xv;
                        f2=f0;
                        f0=fv;
                    else
                        if(fv<=f0)
                            x1=xv;
                            x2=x0;
                            x0=1/2*(x1+x2);
                            f1=fv;
                            f2=f0;
                            f0=f(x0);
                        else
                            x1=xv;
                            f1=fv;
                        end
                    end
                else
                    %step9
                    x1=x_;
                    x2=x0;
                    x0=1/2*(x1+x2);
                    f1=f_;
                    f2=f0;
                    f0=f(x0);
                end
            end
        end
    end
    


end

二、应用以上代码解决问题

\LARGE min x^4-4x^3-6x^2-16x+4

代码如下:

[a,b,c]=jintuifa(0,0.1);
x=Fibonacci(a,c,10^-4);
fprintf('Fibonacci:\tx*=%f\tf(x)=%f\n',x,f(x));
x=huangjinfenge(a,c,10^-4);
fprintf('黄金分割法:\tx*=%f\tf(x)=%f\n',x,f(x));
x=paowuxian(a,b,c,10^-4,10^-30);
fprintf('抛物线法:\tx*=%f\tf(x)=%f\n',x,f(x));

结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值