我有两个截然不同的问题,但将它们放在一起是因为我相信解决方案是相关的。我正在测试牛顿法和正割法(每个方法都是用循环实现的)并在同一轴上绘制结果与计算时间的关系以进行比较。我希望(离散的)牛顿法结果用蓝线连接,割线法结果用红线连接。这些线条又由相应的图例注释。这并没有发生,因为图上的每个点似乎都被视为单个对象,因为它们是单独创建的。 legend
命令会显示两个蓝色星号,而不是一个蓝色星号和一个红色星号(我希望我可以在这里发布我的情节,但我还没有图像权限。)
这是我的缩写代码:
f = (x) % define function
figure
hold on
%% Newton
tic
while % terminating condition
% [Newtons method]
t = toc;
plot(t,log(abs(f(z)),'b*-')
end
%% Secant
tic
while % terminating condition
% [secant method]
t = toc;
plot(t,log(abs(f(z)),'r*-')
end
legend('Newton''s','Secant')
现在不需要了,linespec
中的 '-'
不会做任何事情,因为只绘制了一个点,而不是一条线。我知道我可以用 plot([t_old t],[log(abs(f(z_old) log(abs(f(z)])
之类的东西在每次迭代中绘制线图,但是这并不理想,尤其是因为 log(abs(f(z_old)))
每次都必须重新评估。此外,这也无法解决图例的问题。
我认为,如果我能让 MATLAB 理解我正试图在轴上创建两个对象,一条蓝线和一条红线,那么这两个问题都将得到解决。谢谢。
最佳答案
如果您不想将 x/y 数据存储在向量中然后重新绘制整个向量,您可以使用如下代码将其添加到绘图线:
hNewton = [];
while % terminating condition
% [Newtons method]
t = toc;
if isempty(hNewton)
hNewton = plot(t,log(abs(f(z))),'b*-'); % First time through plot and save the line handle
else
% On all subsequent passes, just add to the lines X/Y data
set(hNewton,'XData',[get(hNewton,'XData') t]);
set(hNewton,'YData',[get(hNewton,'YData') log(abs(f(z)))]);
end
end
由于现在只有 2 行,图例按预期工作。
或者,您可以将代码添加到函数中的现有行
function hLineHandle = AddToLine( hLineHandle, xData, yData, lineStyle )
% AddToLine - Add data to a plotted line
if isempty(hLineHandle)
hLineHandle = plot(xData,yData, lineStyle);
else
set(hLineHandle,'XData',[get(hLineHandle,'XData') xData]);
set(hLineHandle,'YData',[get(hLineHandle,'YData') yData]);
end
end
这使得主脚本/函数中的代码更加清晰。
hNewton = [];
while % terminating condition
% [Newtons method]
t = toc;
hNewton = AddToLine(hNewton,t, log(abs(f(z))),'b*-' );
end
关于MATLAB:用一个循环在一个轴上绘图:实线和图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18952649/