关于matlab中plotyy命令的疑问(采用数组化编程和for循环的差别)

在用matlab中plotyy命令作双纵坐标图时遇到下列问题:(1)当采用for循环时
for x=0:0.1:20
y1 =200*exp(-0.05*x)*sin(x)
y2 = 0.8*exp(-0.5*x)*sin(10*x)
plotyy(x,y1,x,y2)
hold on
end
图像为:

(2)当采用数组化编程时
x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
plotyy(x,y1,x,y2)
图像为:

问题:
(1)为什么会出现这种差别
(2)如果我用for循环编程想得到图2所示的效果,应该如何操作
附言:这只是个简单的例子,笔者编程能力有限,现编一个较复杂的程序,采用的是for循环做的,数据处理时想用双纵坐标图

plotyy接受的参数,x和y1,y2是数组
函数会自动将数组中相邻的数据有线连起来形成曲线

每次的x和y1,y2数据只是一个点的画
循环运行plotyy,会每次画一个图,而每个图只有一点
就会出现你运行的情况,下面很多个图的很坐标都叠到一起,什么都看不清
而点也分开,不会连成曲线

如果要用for循环你也只能用for循环生成数组,再一次画出来
for i=0:0.1:20
x(i)=i;
y1(i)=200*exp(-0.05*x(i))*sin(x(i))
y2(i) = 0.8*exp(-0.5*x(i))*sin(10*x(i))
end
plotyy(x,y1,x,y2);

但运行效率也不及数组化高
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-20
需要用循环的话:
x=0:0.1:20;
len = length(x);
y1 = zeros(len,1); y2 = y1;
for i=1:len
y1(i) =200*exp(-0.05*x(i))*sin(x(i));
y2(i) = 0.8*exp(-0.5*x(i))*sin(10*x(i));
end
plotyy(x,y1,x,y2)
Matlab的基本数据类型是矩阵,能够用向量化编程时尽量避免使用循环!

分析:
for x=0:0.1:20
%每次产生一个点对
y1 =200*exp(-0.05*x)*sin(x)
y2 = 0.8*exp(-0.5*x)*sin(10*x)
plotyy(x,y1,x,y2) 每次在前一次的基础上加上一个点
hold on
end
显示的内容并没错,你可以用 axis([0 20 -200 200]) 查看结果
黑色部分是因为你逐点绘制时,会添加很多刻度和刻度标记,这些内容太过密集,看上去就那样了追问

能不能只通过设置坐标轴格式,就能达到第二个图所示的效果,谢谢

追答

显然不能,逐点添加的话当前点不会与之前的点连接(连接关系无法确定)。
鉴于x递增,你可以选择
axes,hold on
y1 = []; y2 = [];
for i=1:len
y1 =[y1;200*exp(-0.05*x(i))*sin(x(i))];
y2= [y2;0.8*exp(-0.5*x(i))*sin(10*x(i))];
plotyy(x(1:i),y1,x(1:i),y2)
end
hold off
这样实际上是在不断重复的画,最先plot的点将被画i次。

本回答被提问者采纳