Matlab绘制循环错误

时间:2014-03-16 01:41:33

标签: matlab plot

我在for循环中创建数字。该图是2D网格图,应该在每次迭代时更新。要在200x200数组中绘制的值。

我的问题是:计算似乎每次迭代都在运行,但无论我只是绘制或保存到文件,绘图始终是第一个创建的。

这是我的代码:

x = 1:200;
y = x;

for i = 1:100000

   c = calculate(stuff, c); % value to be created, nothing to do with x and y

   h = figure;
   mesh(x,y,c);
   saveas(h, sprintf('FIG%d.jpg',i);
   drawnow;    % did not work with or without this command
   close(h);

end

首先,感谢您的所有意见和建议!我没想到会在这么短的时间内得到这么多的帮助!

然后,我可以回答一些混淆。

致Daniel:是的,c正在改变。该程序根据其先前的值计算c。并且有足够的步骤让c改变。

致R.Schifini:我试过暂停(.1)但遗憾的是没有帮助

安德鲁:谢谢你的指点。现在附上完整的程序。至于Daniel,该程序根据以前的值计算c的值。

To The Duck:我尝试过clf(h,'重置'),但不幸的是它没有帮助。

完整代码:

主程序:如果您有兴趣,请参阅维基百科的物理方程式

http://en.wikipedia.org/wiki/Cahn%E2%80%93Hilliard_equation

% Program to calculate composition evolution for nucleation and growth
% by solving Cahn-Hilliard equation - Time dependent non-linear
% differential equation



% Parameter
sig = 0.1; % J/m^2
delta = 10E-9; % m
D = 1E-9; %m^2/s
A = 10*sig/delta;    % J/m
K = 3*sig*delta;   % J/m^3
M = D/(2*A);   % m^2/s
N = 200;    % mesh size
dt = 1E-12; %s
h = delta/10;

% Rng control
r = -1+2.*rand(N);
beta = 1E-3;
n = 10000;

% initialization
c0 = zeros(200);
c0 = c0+ 0.1+beta.*r;
c = c0;

x = h.*linspace(-N/2,N/2,N);
y=x;


% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

    % Save image every 2000 steps
 %  if ( i==1000 || i==10000 || i==100000)

   %       h = mesh(x,y,c);
   %       pause(.1);
   %       saveas(h, sprintf('FIG%d.jpg',i));
   %       clf(h,'reset');

   % end

end

%h = figure;
mesh(x,y,c);
拉普拉斯函数:

function LP_c = laplacian(c,h)

v1 = circshift(c,[0 -1]);
v2 = circshift(c,[0 1]);
v3 = circshift(c,[-1 0]);
v4 = circshift(c,[1 0]);

LP_c = (v1+v2+v3+v4-4.*c)./(h^2);

end

结果:

您可以看到主程序中的注释部分是用于定期绘图。它们都为每次迭代提供相同的图。我尝试了当前的OR版本,也试过if(mod(i,2000)== 0)来绘制更多的图片。没有区别。所示: enter image description here

但是,如果我注释掉周期性绘图,只需运行不同n值的程序,我得到不同的图,他们遵守物理定律(演化结构),按时间顺序显示

enter image description here

enter image description here

enter image description here

因此我排除了c可能无法更新的可能性。它必须是对matlab绘图功能的一些误用。或者也许是一些记忆问题?

我在编辑会话期间发现了一个有趣的观点:如果我将命令h = figure放在循环前面并在循环结束后绘制,如下所示:

h = figure;
% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

end

mesh(x,y,c);

似乎循环期间计算的所有c值都会重叠并给出如下所示的数字:我猜这表明有关matlab绘图功能的一些事实,但我不确定

enter image description here

顺便说一句,我可以直接回答每条评论并点亮我帖子中新添加的部分吗?对不起,我对Stack Overlow并不熟悉,因为我应该:)

1 个答案:

答案 0 :(得分:3)

我运行你的日常工作,并通过以下更改对我有用:

% Iteration
for i = 1:n
    LP_c = laplacian(c,h);
    d_f = A*(4*(c.^3)-6*(c.^2)+2*c);
    sub = d_f - (2*K)*LP_c;
    LP_RHS = laplacian(sub,h);
    RHS = M*LP_RHS;

    c = c + dt.*RHS;

    % Save image every 2000 steps
    if ( mod(i,2000)==0)
        h1 = mesh(x,y,c);
        drawnow;
        saveas(h1, sprintf('FIG%d.jpg',i));
    end

end

主要变化是从hh1的数字句柄变量。
为什么?您已在方程式中使用变量h

此致