我在下面写了一个简单的代码来制作动画图,但它们往往是计算密集型的,比整个时间长了整整几秒:
function animplot(t,f,ymin,ymax,dt,num_iters)h = ……
一个明显更高效的代码,适用于每个解决方案 相关询问 :
function animplot(t,f,ymin,ymax,dt,num_iters,T) % ANIMPLOT(t,f,ymin,ymax,dt,num_iters) -- f must be defined w/ handle, % e.g. f = @(t)sin(t); default T = 5, num_iters = 500, dt = .05, % (ymax - ymin) = 1.4*range. switch nargin case 6; T = 5; case 5; T = 5; num_iters = 500; case 4; T = 5; num_iters = 500; dt = .05; case 2; T = 5; num_iters = 500; dt = .05; ymin = 1.2*min(f(t)) - max(f(t))/5; ymax = 1.2*max(f(t)) - min(f(t))/5; end dT = T/num_iters; % set pause interval h = plot(0,0,'LineWidth',2,'color','b'); % set initial handle set(h, 'Xdata',t, 'Ydata', f(t)); % initialize curve plot axis([min(t) max(t) ymin ymax]); tic % start timer for i=2:num_iters pause(dT) set(h, 'Ydata', f(t-dt*i)) end toc % end timer, return time elapsed since 'tic' end
注意: num_iters 主要用作动画'分辨率';更高的是以更大的偏差为代价 T 。
num_iters
T
使用命令:“set(h,'Xdata',t,'Ydata',f(t))”将比在每次循环迭代中重用绘图函数更有效,并且可能足以实现结果你在找。为了进一步改进,您可以启用可变帧速率。为此,消除任何“暂停(dt)”,获取当前循环迭代“t”的时间,评估当时“f(t)”的函数,并将绘图x和y数据设置为该值。这将确保动画平滑不超过指定的时间。您还可以通过使用“interp1(x,v,xq)”函数在数据点之间进行线性插值,将此技术用于数据集,而不仅仅是函数。