如何在Octave或Matlab中绘制带有两个变量的函数?

11

我希望使用Octave绘制像这样的两个变量的函数:f(x,y) = x^2 + 3y。绘制单一变量函数非常容易,但我找不到如何绘制双变量函数的方法。有人知道最好的方法吗?

3个回答

12

绘制两个变量的函数通常意味着3D图 - 在MATLAB中,你可以使用函数plot3来实现。要绘制区间[-10,10]内变量X和Y的函数f(x,y),您可以使用以下命令:

x = [-10:.1:10];
y = [-10:.1:10];
plot3(x, y, x.^2 + 3*y)
grid on

9

如果有人需要的话,我在Octave中运行了选定答案中的代码,并得到了以下绘图:

enter image description here

但我真的希望这个函数对于x和y的笛卡尔积中的每个点都能起作用,而不仅仅是沿着对角线,所以我使用了mesh函数来得到这个带有在x、y平面上投影等高线的3D图:

x = [-10:.1:10];
y = [-10:.1:10];
[xx, yy] = meshgrid (x, y);
z = xx.^2 + 3*yy;
mesh(x, y, z)
meshc(xx,yy,z) 
xlabel ("x");
ylabel ("y");
zlabel ("f(x,y)");
title ("f(x,y) = x^2 + 3y");
grid on

enter image description here

为了消除绘图中的网格线纹理,函数surf派上了用场:
x = [-10:.1:10];    
y = [-10:.1:10];
[xx, yy] = meshgrid (x, y);
z = xx.^2 + 3*yy;
h = surf(xx,yy,z);
colormap hsv;
set(h,'linestyle','none');
xlabel ("x");
ylabel ("y");
zlabel ("f(x,y)");
title ("f(x,y) = x^2 + 3y");

enter image description here

另一种绘图方法是将其作为带有等高线的热图

x = [-10:.1:10];
y = [-10:.1:10];
[xx, yy] = meshgrid (x, y);
z = xx.^2 + yy.*3;
contourf(xx,yy,z);
colormap hsv;
xlabel ("x");
ylabel ("y");
zlabel ("f(x,y)");
title ("f(x,y) = x^2 + 3y");
grid on

enter image description here

为了完整性,这些级别可以被标记:

x = [-10:.1:10];
y = [-10:.1:10];
[xx, yy] = meshgrid (x, y);
z = xx.^2 + 3*yy;
[C,h] = contour(xx,yy,z);
clabel(C,h)
xlabel ("x");
ylabel ("y");
zlabel ("f(x,y)");
title ("f(x,y) = x^2 + 3y");
grid on

enter image description here


1
这是一个优秀的答案。视觉效果对于初学者寻求帮助非常有帮助,特别是像这样的事情。展示多个选项提供了最高的价值。 - SecretAgentMan
现在你只需要使用 surfc请参见文档)就能让这个答案变得规范化。希望你能添加。 - SecretAgentMan

4
除了来自@Toni@esskov的出色答案外,对于未来绘制具有两个变量的函数的人来说,contourcontourf function在某些应用中非常有用。

Contour & Filled Contour Plots

MATLAB代码(2018b):

x = [-10:.1:10];    
y = [-20:.1:20];
[xx, yy] = meshgrid (x, y);
z = xx.^2 + 3*yy;           % Borrowed 4 lines from @Toni

figure
s(1) = subplot(1,2,1), hold on  % Left Plot
    [M,c] = contour(xx,yy,z);   % Contour Plot
    c.ShowText = 'on';          % Label Contours
    c.LineWidth = 1.2;          % Contour Line Width
    xlabel('X')
    ylabel('Y')
    box on
s(2) = subplot(1,2,2), hold on  % Right Plot
    [M2,c2] = contourf(xx,yy,z);
    colorbar                    % Add Colorbar
    xlabel('X')
    ylabel('Y')
    box on
title(s(1),'Contour Plot')
title(s(2),'Filled Contour Plot')

更新:添加了 surfc 的示例。 带有轮廓的3D表面
h = surfc(xx,yy,z)

我没有意识到你在我编辑我的答案时添加了等高线图。 - Antoni Parellada
@Toni 不用担心。你的回答非常专业,我只是觉得应该再补充一下。我看到你在我的帖子发布后也添加了 contourf。现在你的回答几乎可以称为标准答案了... - SecretAgentMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接