我在Matlab中有两个轮廓图,并且两个图都有一条指定单个Z值的曲线。我想强加两个轮廓图,以便可以找到两个z值曲线相交的唯一解决方案。我该如何叠加两个等高线图?
InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), StandardCharsets.UTF_16);
答案 0 :(得分:2)
您可以使用contourc
或使用contour
指定相同的轮廓(等值线)来获得最终结果。
此答案使用this answer在方法1 中扩展了contourc
,并在方法2 中使用contour
提供了简单的解决方案。
您可能会问“ 为什么方法2这么简单的方法1?” 如果您需要一种数值方法来搜索交点,则方法1提供了一种直接访问各个等值线的方法。
示例数据:
% MATLAB R2018b
x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y); % Placeholder 1
W = sqrt(X.*Y + X.^2 + Y.^(2/3)); % Placeholder 2
从2个轮廓图中覆盖单个等值线
模仿this answer并使用
v = [.5 0.75 .85 1]; % Values of Z to plot isolines
我们可以分别可视化这两个函数Z
和W
。
我们可以覆盖等值线,因为它们共享相同的(x,y)域。例如,它们都等于 0.8 ,如下所示。
val = 0.8; % Isoline value to plot (for Z & W)
Ck = contourc(x,y,Z,[val val]);
Ck2 = contourc(x,y,W,[val val]);
figure, hold on, box on
plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2,'DisplayName',['Z = ' num2str(val)])
plot(Ck2(1,2:end),Ck2(2,2:end),'b-','LineWidth',2,'DisplayName',['W = ' num2str(val)])
legend('show')
从2个轮廓图中覆盖多个等值线
我们也可以一次使用更多等值线。
v = [1 0.5]; % Isoline values to plot (for Z & W)
figure, hold on, box on
for k = 1:length(v)
Ck = contourc(x,y,Z,[v(k) v(k)]);
Ck2 = contourc(x,y,W,[v(k) v(k)]);
p(k) = plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2,'DisplayName',['Z = ' num2str(v(k))]);
p2(k) = plot(Ck2(1,2:end),Ck2(2,2:end),'b-','LineWidth',2,'DisplayName',['W = ' num2str(v(k))]);
end
p(2).LineStyle = '--';
p2(2).LineStyle = '--';
legend('show')
没有使其漂亮...
% Single Isoline
val = 1.2;
contour(X,Y,Z,val), hold on
contour(X,Y,W,val)
% Multiple Isolines
v = [.5 0.75 .85 1];
contour(X,Y,Z,v), hold on
contour(X,Y,W,v)
清除这些内容以进行演示很简单。如果val
是一个标量(单个数字),则c1 = contour(X,Y,Z,val);
和c2 = contour(X,Y,W,val)
为每个等高线图提供等值线。