1. 一些自己的想法
在上次的培训中心,我已经利用数值计算的方法,将追击问题的近似解求解了出来,其具体代码如下:
clear all;
dt = 0.0001;
i = 1;
x_w(i) = 0;
y_w(i) = 30 * dt;
x_p(i) = 20;
y_p(i) = 0;
while(y_p(i) < y_w(i))
i = i + 1;
x_w(i) = 0;
y_w(i) = y_w(i-1) + 30 * dt;
v_x = 40 * sin(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
v_y = 40 * cos(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
x_p(i) = x_p(i-1) + v_x * dt;
y_p(i) = y_p(i-1) + v_y * dt;
end
plot(x_p,y_p);
hold on;
plot(x_w,y_w);
观察代码可以发现,我是在全部计算完成之后,才将图像画了出来,如果我们在每次循环过程中都进行画图的操作,就可以得到动态图像,但是这种动态图像只是一种为伪动态图像,并不是真正的动态图像,也无法作为GIF格式进行输出,其代码如下:
clear all;
dt = 0.0001;
i = 1;
x_w(i) = 0;
y_w(i) = 30 * dt;
x_p(i) = 20;
y_p(i) = 0;
while(y_p(i) < y_w(i))
i = i + 1;
x_w(i) = 0;
y_w(i) = y_w(i-1) + 30 * dt;
v_x = 40 * sin(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
v_y = 40 * cos(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
x_p(i) = x_p(i-1) + v_x * dt;
y_p(i) = y_p(i-1) + v_y * dt;
plot(x_p,y_p);
hold on;
plot(x_w,y_w);
hold on;
axis([-5,30,-5,40]);
pause(0.00001);
end
经过测试,发现效果并不是很好,会一直闪动,如果用两层嵌套应该可以解决这个问题
2. 利用VideoWriter进行动态曲线视频制作
通过学习《MATLAB绘制动态曲线》的画图思想,我将自己的代码改为了如下:
clear all;
dt = 0.01;
i = 1;
x_w(i) = 0;
y_w(i) = 30 * dt;
x_p(i) = 20;
y_p(i) = 0;
writer = VideoWriter("Trace.avi");
open(writer);
figure;
while(y_p(i) < y_w(i))
i = i + 1;
x_w(i) = 0;
y_w(i) = y_w(i-1) + 30 * dt;
v_x = 40 * sin(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
v_y = 40 * cos(atan((x_w(i-1) - x_p(i-1))/(y_w(i-1) - y_p(i-1))));
x_p(i) = x_p(i-1) + v_x * dt;
y_p(i) = y_p(i-1) + v_y * dt;
plot(x_p,y_p,'*');
hold on;
plot(x_w,y_w,'o');
axis([-5,30,-5,40]);
frame = getframe;
writeVideo(writer,frame);
hold off
end
close(writer);
运行之后便可以得到Trace.avi文件,利用其它软件将其转化为GIF图之后,其效果如下:

1193

被折叠的 条评论
为什么被折叠?



