如何利用MATLAB的surf函数,画出三元一次方程的空间平面?

0 前言

疫情期间,在家无事,因为之前学的MATLAB和线性代数不是很扎实,决定在MOOC上找网课,温故一下。看到老师的图,如图1,非常直观,于是就想用MATLAB画出来。
示例1

1 空间曲面的MATLAB命令及其用法

首先查询一下MATLABlink中能够画三维图的函数。
通过观察,选出surf函数和mesh函数,查看其用法。

1 surf函数语法及其说明 1

surf(X,Y,Z)
surf(X,Y,Z) 创建一个三维曲面图,它是一个具有实色边和实色面的三维曲面。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。曲面的颜色根据 Z 指定的高度而变化。
surf(X,Y,Z,C)
surf(X,Y,Z,C) 指定曲面的颜色。
surf(Z)
surf(Z) 创建一个曲面图,并将 Z 中元素的列索引和行索引用作 x 坐标和 y 坐标。
surf(Z,C)
surf(Z,C) 指定曲面的颜色。
surf(ax,___)
surf(ax,___) 将图形绘制到 ax 指定的坐标区中,而不是当前坐标区中。指定坐标区作为第一个输入参数。
surf(___,Name,Value)
surf(___,Name,Value) 使用一个或多个名称-值对组参数指定曲面属性。例如,‘FaceAlpha’,0.5 创建半透明曲面。
s = surf(___)
s = surf(___) 将返回一个图曲面对象。在创建曲面之后可使用 s 对其进行修改。有关属性列表,请参阅 Surface 属性link

2 mesh函数及其说明2

mesh(X,Y,Z)
mesh(X,Y,Z) 创建一个网格图,该网格图为三维曲面,有实色边颜色,无面颜色。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。边颜色因 Z 指定的高度而异。
mesh(Z)
mesh(Z) 创建一个网格图,并将 Z 中元素的列索引和行索引用作 x 坐标和 y 坐标。
mesh(Z,C)
mesh(Z,C) 进一步指定边的颜色。
mesh(___,C)
mesh(___,C) 进一步指定边的颜色。
mesh(ax,___)
mesh(ax,___) 将图形绘制到 ax 指定的坐标区中,而不是当前坐标区中。指定坐标区作为第一个输入参数。
mesh(___,Name,Value)
mesh(___,Name,Value) 使用一个或多个名称-值对组参数指定曲面属性。例如,‘FaceAlpha’,0.5 创建半透明网格图。
s = mesh(___)
s = mesh(___) 将返回一个图曲面对象。在创建网格图后,使用 s 修改网格图。有关属性列表,请参阅 Surface 属性link

2 surf函数的实现过程

选择surf函数和mesh函数作图。

x=[0:6];
y=[0:6];
[X,Y] = meshgrid(x,y);
Z1=5+Y-X;
surf(X,Y,Z1)

surf1

x=[0:6];
y=[0:6];
[X,Y] = meshgrid(x,y);
Z1=5+Y-X;
mesh(X,Y,Z1)

mesh1
观察两张图片,能够看出明显的不同。通过surf函数画出的图像是曲面,而通过mesh函数画出的图像是网格。

3 图像的优化

接下来对用surf函数画出的图像进行去除网格线,统一曲面颜色,得到我们想要的图像。

y=[0:6];
[X,Y] = meshgrid(x,y);
Z1=5+Y-X;
surf(X,Y,Z1,'facecolor','b','LineStyle' ,'none')
%曲面颜色为蓝色,无线型。

surf2
好像有点意思了,再将坐标间隔统一,添上标签。

x=[0:6];
y=[0:6];
[X,Y] = meshgrid(x,y);
Z1=5+Y-X;
surf(X,Y,Z1,'facecolor','b','LineStyle' ,'none')
xticks(0:1:6)
yticks(0:1:6)
zticks(-5:1:15)
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')

surf3
最后尝试多画几个图,放在一起比较一下。

x=[0:10];
y=[0:10];
[X,Y] = meshgrid(x,y);
subplot(2,3,1)
Z1=5+Y-X;
surf(X,Y,Z1,'facecolor','r','LineStyle' ,'none')
subplot(2,3,2)
Z2=4+2*X-3*Y;
surf(X,Y,Z2,'facecolor','g','LineStyle' ,'none')
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')
subplot(2,3,3)
Z3=-4+2*X+Y;
surf(X,Y,Z3,'facecolor','b','LineStyle' ,'none')
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')
subplot(2,3,[4 5])
Z1=5+Y-X;
surf(X,Y,Z1,'facecolor','r','LineStyle' ,'none')
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')
hold on
%这里需要用到hold on命令,否则第四幅子图不能同时显示三个函数的图像。
Z2=4+2*X-3*Y;
surf(X,Y,Z2,'facecolor','g','LineStyle' ,'none')
xlabel('x轴')
ylabel('y轴')
zlabel('z轴')
Z3=-4+2*X+Y;
surf(X,Y,Z3,'facecolor','b','LineStyle' ,'none')
legend('Z1=5+Y-X','Z2=4+2*X-3*Y','Z3=-4+2*X+Y')

surf4
最后的最后,回顾一下刚刚的那张图片。
示例
好像差不多呀。

4 结论

通过这个例子,我们发现MATLAB还是很强大的,尝试命令,简单绘出图形,再在其基础上进行修改,就可以得到我们想要的图形了。当然了也有很多优秀的绘图工具,如画流程图的Visio、数据处理的Origin、LaTex中的Tikz等。


  1. https://ww2.mathworks.cn/help/matlab/ref/surf.html ↩︎

  2. https://ww2.mathworks.cn/help/matlab/ref/mesh.html ↩︎

发布了6 篇原创文章 · 获赞 2 · 访问量 698

猜你喜欢

转载自blog.csdn.net/qq_39979317/article/details/104959575