1. 首页 > 科技

Matlab 这段代码可以如何优化? matlab优化

Matlab 这段代码可以如何优化?matlab优化

matlab优化问题

在matlab里输入:edit zhidao.m

然后将下面两行写入,并保存

function y=zhidao(x)

y=16915/(x(1)*x(2))+59*x(1)^0.2*x(2)^1.2+100;

回到matlab,输入以下内容

xmin=[7;0.05];

xmax=[65;1.59];

x0=xmin;

[x,ymin,flag,c]=fmincon('zhidao',x0,[],[],[],[],xmin,xmax);

x,ymin

得到的结果:

x =

65.0000

1.2364

ymin =

485.8729

matlab 运行下面这个程序需要好长时间,怎么优化?

几个方面:

1、最大的问题是循环体里面的 pause(0.1),尤其是里面那一层循环。

2、很多赋值语句后面应该加分号,避免显示。

3、数组预置(对于这段代码而言不是很重要)。

 

里面那层的pause是在这样的循环结构中:

for k=1:10;

    i=i+1;

    for x=2:z-1;

        for y=2:z-1;粗略估算一下,会执行10*18*18次,每次0.1秒,仅这一句就会耗时324秒。

删除上述pasue之后,在我的电脑上运行大约需要27秒。

 

有多处赋值语句的尾部没有使用分号,导致数组在命令窗口中回显,这也会占用很多时间。那些语句就不一一列举了,修改后的代码如下:

clear all;clc;

z=20;i=0;

a=cat(3,rand(z),rand(z),zeros(z));

b=a(:,:,1);%HSI

c=a(:,:,2);%生物量

imh=image(cat(3,c,zeros(z),zeros(z)));%先生成一个图像

for k=1:10;

    i=i+1;

    for x=2:z-1;

        for y=2:z-1;

            d{x,y}=[b(x-1,y-1),b(x-1,y),b(x-1,y+1);

                b(x,y-1),b(x,y),b(x,y+1);

                b(x+1,y-1),b(x+1,y),b(x+1,y+1)];%表示周围8个HSI

            e{x,y}=[c(x-1,y-1),c(x-1,y),c(x-1,y+1);

                c(x,y-1),1,c(x,y+1);

                c(x+1,y-1),c(x+1,y),c(x+1,y+1)];%表示周围8个生物量 

            while c(x,y)>0&&min(min(e{x,y}))<1&&min(min(d{x,y}))~=0&&c(x,y)~=0%如果当前位置(x,y)生物量大于0,并且

                %该位置周围8个网格生物量有小于环境容纳量,

                %并且,周围8个网格最小适宜度值不等于0

                %并且,当前位置生物量不等于0的情况

                [m,n]=find(d{x,y}==max(max(d{x,y})));%获取周围8个网格最大的HSI,确定迁移方向

                if isequal([m,n],[x,y])%如果目标单元是当前位置,即m,n和x,y相等

                    c(m,n)=c(x,y);%那么生物量不迁移

                    set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

                    break

                else

                    if c(m,n)<1%判定目标单元生物量是否饱和,若不饱和

                        c(m,n)=c(m,n)+c(x,y);%目标单元生物量等于已有+迁移的(x,y)的生物量

                        if c(m,n)>1

                            c(m,n)=1;

                        end

                        c(x,y)=1-c(m,n);

                        if c(x,y)>=0

                            c(x,y)=0;%迁移过后命令该点生物量等于零

                            set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

                            break 

                        else 

                            c(x,y)=c(m,n)-1;

                        end

                    else

                        d{x,y}(m,n)=0;%若饱和了,重新选择方向,命令目标单元HSI=0.重新选择方向

                    end

                end

            end

              % pause(0.1)

        end

    end

    set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

    pause(0.1)

end

i这样修改之后,在我的电脑上运行至需要大约1.3秒。如果再把最后的一个pause删掉,则仅需大约0.3秒。

matlab处理优化问题的基本步骤?

建立优化问题的数学模型--->选择合适的优化方法(matlab提供的或自己设计的)---->matlab编程----->仿真测试

MATLAB 优化程序

用fmincon()求得

Active inequalities (to within options.TolCon = 1e-006):

lower upper ineqlin ineqnonlin

4

5

x =

31.4100 0.1600

fval =

12.9852