当前位置:首页 > 地信家园 > matlab多种方法求一元、二元函数最值

matlab多种方法求一元、二元函数最值

正文索引[ 隐藏 ]

    第一类为y=f(x)( x∈D)型。自变量个数只有x一个。具体函数如下:

    f(x)=10-(0.4+sinc(4x)+1.1sinc(4x+2)+0.8sin(6x-2)+0.7sinc(6x-4))

    clip_image002

    其中:x∈[-2,2]

    绘图:

    1、首先构造函数f1: 对应文件f1.m

    function a=f1(x)

    a=10-(0.4+sinc(4*x)+1.1*sinc(4*x+2)+0.8*sin(6*x-2)+0.7*sinc(6*x-4));

    end

    2、然后构造判别函数sinc,用于分段函数判定: 对应文件sinc.m

    function a=sinc(x)

    if x==0

    a=1;

    else

    a=sin(pi*x)/(pi*x);

    end

    3、利用fplot画出图像: 对应文件f1huatu.m

    fplot(‘f1′,[-2,2])

    求最小值:

    1、基本方法求取最小值: 对应文件f1jibenfangfazuixiaozhi.m

    [x,fval]=fminbnd(‘f1′,-2,2)

    2、其他方法求取最小值: 对应文件f10618fa.m

    基本思想方法:

    这个方法是根据图像,我可以知道最小值处于的区间【a,b】,于是利用函数,我求取f1(a)和f1(b)的值,此外,将区间【a,b】按照黄金分割,取区间中的黄金分割点c=a+(b-a)*0.618,之后求取f1(c)的值,最后比较f1(a)、f1(b)、f1(c)的大小,然后将其中最小值和第二小值对应的自变量值重新赋给a、b,之后循环,直至符合精度条件abs(f1(a)-f1(b))<t,最终把f1(c)最为函数近似的最小值。

    对应代码:

    clear;

    a=-0.75;

    b=-0.25;

    t=input(请输入步长t=’);

    while (abs(f1(a)-f1(b))>t)

    c=a+(b-a)*0.618;

    if f1(a)<=f1(b)

    if f1(a)<=f1(c)

    min=a;

    if f1(b)<=f1(c)

    max=b;

    else

    max=c;

    end

    else

    min=c;

    max=a;

    end

    else

    if f1(b)<=f1(c)

    min=b;

    if f1(a)<=f1(c)

    max=a;

    else

    max=c;

    end

    else

    min=c;

    max=b;

    end

    end

    a=min;

    b=max;

    end

    disp(‘最小值为:’);

    disp(f1(a+(b-a)*0.618));

    disp(‘对应的x为:’);

    disp(a+(b-a)*0.618);

    第二类Z=f(x,y)( x∈D1, y∈D2)型模型,函数具体表达式为:
    clip_image004

    定义域:x∈[-3,3], y∈[-3,3]

    绘图:

    1、首先构造函数f2: 对应文件f2.m

    function a=f2(x,y)

    a=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-1/3*exp(-(x+1).^2-y.^2);

    end

    2、利用surfc画出图像: 对应文件f2huatu.m

    x=-3:0.1:3;

    y=-3:0.1:3;

    [x,y]=meshgrid(x,y);

    z=f2(x,y);

    surfc(x,y,z)

    求最小值:

    1、基本方法求取最小值: 对应文件f2jibenfangfazuixiaozhi.m

    [x,fval]=fminsearch(@f2m,[-2,0])

    2、自己的方法求取最小值: 对应文件f2pashan.m

    基本思想方法:

    这个方法同样是根据图像,我可以知道最小值处于的区间点(x,y)附件,于是利用函数,我求取f2(x,y)、f2(x+t,y)、f2(x-t,y)、f2(x,y+t)、f2(x,y-t)五个函数值,相当于以最初的(x,y)为中心,前后左右各探出一定步长。然后比较他们五个的大小,将最小的那个函数值对应的点最为新的(x,y),之后循环,直至符合条件最小的那个点就是中心的点,最终把这个点的函数值作为函数近似的最小值。这个方法可以说是相当于爬山,当前位置也就是中心点,然后前后左右试探一下,如果某个方向最高,则向那个方法迈一步,如果周围都比当前位置低,那么当前位置就是最高点。只是这里是求最小值,不过原理一样。

    对应代码:

    clear;

    x=-2;

    y=0;

    t=input(‘请输入步长t=’);

    x1=x+t;

    x2=x-t;

    y1=y+t;

    y2=y-t;

    z0=f2(x,y);

    z1=f2(x1,y);

    z2=f2(x2,y);

    z3=f2(x,y1);

    z4=f2(x,y2);

    z=[z0,z1,z2,z3,z4];

    if min(z)==z0

    xmin=x;

    ymin=y;

    end

    if min(z)==z1

    xmin=x1;

    ymin=y;

    end

    if min(z)==z2

    xmin=x2;

    ymin=y;

    end

    if min(z)==z3

    xmin=x;

    ymin=y1;

    end

    if min(z)==z4

    xmin=x;

    ymin=y2;

    end

    while (xmin~=x || ymin~=y)

    x=xmin;

    y=ymin;

    x1=x+t;

    x2=x-t;

    y1=y+t;

    y2=y-t;

    z0=f2(x,y);

    z1=f2(x1,y);

    z2=f2(x2,y);

    z3=f2(x,y1);

    z4=f2(x,y2);

    z=[z0,z1,z2,z3,z4];

    if min(z)==z0

    xmin=x;

    ymin=y;

    end

    if min(z)==z1

    xmin=x1;

    ymin=y;

    end

    if min(z)==z2

    xmin=x2;

    ymin=y;

    end

    if min(z)==z3

    xmin=x;

    ymin=y1;

    end

    if min(z)==z4

    xmin=x;

    ymin=y2;

    end

    end

    disp(‘最小值为:’);

    disp(min(z));

    disp(‘对应的X和Y为:’);

    disp(xmin);

    disp(ymin);

    相关文件下载:百度网盘
    友荐云推荐
  • «
  • »
  • 作者:
    除非注明,本文原创:技术宅,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.jishuzh.com/gis/matlab多种方法求一元、二元函数最值.html

    One thought on “matlab多种方法求一元、二元函数最值

    1. 润初颜

      技术宅技术宅我打开任督二脉!继续围观中!

    评论已关闭.