当前位置:首页 > 地信家园 > Matlab改进的方法求解函数最值②

Matlab改进的方法求解函数最值②

技术宅继续Matlab改进的方法求解函数最值。这是第二种改进的方法了,相对来说,这个方法应该算比较好的了。

下面是程序代码:

%由于随机数太多,步长太小导致运行较慢,请耐心等候。
function f2min
n1=10000,n2=2;
a=-3+6*rand(n1,n2);%生成一个10000行,2列的随机数矩阵。第一列赋给x,第二列赋给y。
for i=1:10000
x(i)=a(i);
y(i)=a(10000+i);
z(i)=f2(x(i),y(i));%利用x,y随机数得到随机z,即函数值(f2为已知函数)。
end
l=1;
for k=2:10000
if z(l)>z(k)
l=k;
end%得到随机范围内最小的函数值,即此时的x,y在随机矩阵中的行数。由于随机次数多,所以这样产生的值已经很接近于最小值了。
end
x=x(l);
y=y(l);
t=0.0000001;%以t为步长进行运算,由于步长已经足够小,所以我觉得没有必要采用随机步长了,那样只会让运算更缓慢。
%以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);
z5=f2(x1,y1);
z6=f2(x1,y2);
z7=f2(x2,y1);
z8=f2(x2,y2);
z=[z0,z1,z2,z3,z4,z5,z6,z7,z8];
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
if min(z)==z5
xmin=x1;
ymin=y1;
end
if min(z)==z6
xmin=x1;
ymin=y2;
end
if min(z)==z7
xmin=x2;
ymin=y1;
end
if min(z)==z8
xmin=x2;
ymin=y2;
end
while (xmin~=x || ymin~=y)%重复上述运算,直到x,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);
z5=f2(x1,y1);
z6=f2(x1,y2);
z7=f2(x2,y1);
z8=f2(x2,y2);
z=[z0,z1,z2,z3,z4,z5,z6,z7,z8];
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
if min(z)==z5
xmin=x1;
ymin=y1;
end
if min(z)==z6
xmin=x1;
ymin=y2;
end
if min(z)==z7
xmin=x2;
ymin=y1;
end
if min(z)==z8
xmin=x2;
ymin=y2;
end
end
%输出最小值点
str1 = sprintf(‘最小值 f(x,y)=%d’, min(z));
str2 = sprintf(‘此时,x=%d’, xmin);
str3 = sprintf(‘此时,y=%d’, ymin);
disp(str1);
disp(str2);
disp(str3);
disp(min(z));%上面输出为科学计算法
disp(xmin);
disp(ymin);
end

友荐云推荐
  • «
  • »
  • 作者:
    除非注明,本文原创:技术宅,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.jishuzh.com/gis/matlab改进的方法求解函数最值②.html