我在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)来绘制更多的图片。没有区别。所示:
但是,如果我注释掉周期性绘图,只需运行不同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);
似乎循环期间计算的所有c值都会重叠并给出如下所示的数字:我猜这表明有关matlab绘图功能的一些事实,但我不确定
顺便说一句,我可以直接回答每条评论并点亮我帖子中新添加的部分吗?对不起,我对Stack Overlow并不熟悉,因为我应该:)
答案 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
主要变化是从h
到h1
的数字句柄变量。
为什么?您已在方程式中使用变量h
。
此致