我在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,因为我应该有:)
我运行了您的例程,并进行了以下更改,它对我有用:
% 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在方程中使用了变量。
问候,