Matlab绘制循环错误

Cra*_*rog 5 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
Run Code Online (Sandbox Code Playgroud)

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

然后,我可以回答一些混乱.

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

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

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

对The-Duck:我尝试了clf(h,'reset'),但遗憾的是它并没有帮助.

完整代码:

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

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);
Run Code Online (Sandbox Code Playgroud)

拉普拉斯函数:

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
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

在此输入图像描述

在此输入图像描述

在此输入图像描述

因此,我排除了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);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

R. *_*ini 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
Run Code Online (Sandbox Code Playgroud)

主要变化是图窗句柄变量从h变为h1
为什么?您已经h在方程中使用了变量。

问候,