MATLAB中contourslice函数如何使用,画出两个曲面的交线?

您所在的位置:网站首页 matlab画圆柱体 MATLAB中contourslice函数如何使用,画出两个曲面的交线?

MATLAB中contourslice函数如何使用,画出两个曲面的交线?

2023-04-07 00:18| 来源: 网络整理| 查看: 265

本来想说一句去看文档的,结果我自己去看了文档之后发现contourslice的文档也写得很难读懂。于是我就在这儿写一下教程吧。

先来看contourslice这个函数是做什么的。

用一句话概括:它可以用来可视化三元标量函数

先捋一捋啊,啥叫三元标量函数,它的可视化又有什么难点……

y = x^2 + 2x + 3,这是一元标量函数,有一个自变量和一个因变量。一般的可视化方法是在一个平面上画函数图像(曲线),一个坐标轴代表自变量,一个坐标轴代表因变量。

z = x^2 + xy + y^2,这是二元标量函数,有两个自变量和一个因变量。一般的可视化方法是在三维空间中画曲面,两个坐标轴代表自变量,一个坐标轴代表因变量(如下图左)。如果只能在二维平面上可视化,那么常用的做法是画等高线图(contour),两个坐标轴代表两个自变量,等高线上标注因变量的值(如下图右)。

f = x^2 + 4y^2 + z^2,这就是三元标量函数了,有三个自变量和一个因变量。咦?这个东西怎么可视化呢?要四个坐标轴是不现实的……那就只能在三维空间中画“等高面”了。但是这些面是互相套在一起的,很难同时观察……那就这样吧:画出这些“等高面”在一系列平面上的截线,以此来窥视函数长什么样。例如下图,画出了f = x^2 + 4y^2 + z^2的等高面在x=-3,x=0,x=3,z=0这几个面上的截线。

画等高面在平面上的截线,用的就是contourslice函数。

它的第一种用法是这样的:

contourslice(x, y, z, f, Sx, Sy, Sz)

这里面,x, y, z, f共同指明了一个三元标量函数。x, y, z为三维自变量网格,一般用meshgrid函数生成,f为三维数组,代表网格中每一点处的函数值。Sx, Sy, Sz为一维数组。对于Sx中的每个值i,函数会绘制三元标量函数的等高面在x=i平面上的截线;Sy、Sz类似。

比如,上面的图就是这么画的:

[x, y, z] = meshgrid(-5:0.1:5); % 坐标范围与粒度 f = x.^2 + 4 * y.^2 + z.^2; % 定义三元标量函数 contourslice(x, y, z, f, [-3 0 3], [], [0]); % 绘制函数等高面在x=-3, x=0, x=3, z=0平面上的截线 axis equal tight; grid on; box on; % 一些美化操作

画出来的图,要转到一个合适的角度才能看清楚。

这种用法,只能绘制函数等高线在与坐标轴垂直的平面上的截线,颇受局限。

能不能绘制等高线在任意平面上的截线呢?答案是能,并且不仅能绘制任意平面上的截线,还能绘制任意曲面上的截线。

这就涉及到contourslice的第二种用法:

contourslice(x, y, z, f, xi, yi, zi)

这里面x, y, z, f的含义与第一种用法相同;xi, yi, zi都是二维数组,它们指定了三维空间中的一个网格,或者说一个曲面,contourslice将绘制函数等高面在这个曲面上的截线。

举个例子。仍然研究f = x^2 + 4y^2 + z^2这个函数。我们想要画出它在一个圆柱面上的等高线,这个圆柱面的中轴线为z轴,半径为1.5。

首先,我们要造出xi, yi, zi这几个二维网格。构造二维网格最方便的方法是用参数方程。上述圆柱面的参数方程为:

\left\{ \begin{array}{l} x = 1.5\cos u \\ y = 1.5 \sin u \\ z = v \end{array} \right.

于是绘图代码如下:

[x, y, z] = meshgrid(-5:0.1:5); % 坐标范围与粒度 f = x.^2 + 4 * y.^2 + z.^2; % 定义三元标量函数 [u v] = meshgrid((-1:0.1:1) * pi, -5:0.1:5); % 曲面参数范围与粒度 xi = 1.5 * cos(u); yi = 1.5 * sin(u); zi = v; % 定义曲面网格 contourslice(x, y, z, f, xi, yi, zi); % 绘制函数等高面在曲面上的截线 axis equal tight; grid on; box on; % 一些美化操作

把画出来的图转到一个合适的角度,可以看到它长这样:

好了,现在可以考虑题主的问题了:如何绘制两个曲面的交线

经过上面的讲解,我们学会了如何绘制函数的(一族)等高面与一个曲面的(一族)交线。

那么,从这一族等高面中拿出一个,不就成了绘制两个曲面的交线了吗?

比如,如果要绘制曲面x^2 + 4y^2 + z^2 = 4(这是个椭球面)与\left\{ \begin{array}{l} x = 1.5\cos u \\ y = 1.5 \sin u \\ z = v \end{array} \right.(圆柱面)的交线,那么就只需在上一个图中把函数值为4的那一条交线取出来就可以了!

contourslice提供了筛选交线的功能:只需要在调用时加一个参数(一维向量),指明想要画函数值为哪些值时的交线。不过,像我们这样只需要一条交线时,需要把函数值重复一次,放到一个长度为2的向量中。

h = contourslice(x, y, z, f, xi, yi, zi, [4 4]); % 绘制函数值为4的等高面在圆柱面上的截线 set(h, 'EdgeColor', 'b', 'LineWidth', 2); % 看得清楚一些

画出来的交线为:

呃,能看出这是个椭球面与圆柱面的交线吗?最好是把椭球面和圆柱面本身也画出来看看。

根据三元方程x^2 + 4y^2 + z^2 = 4绘制曲面需要用到isosurface和patch函数;根据二维网格绘制曲线需要用到mesh函数。不多说了,直接上代码:

clf; hold all; p = isosurface(x, y, z, f, 4); % 求函数值等于4的椭球面 patch(p, 'EdgeColor', 'c', 'FaceColor', 'y', 'FaceAlpha', 0.3); % 绘制椭球面 mesh(xi, yi, zi, 'FaceAlpha', 0.3); % 绘制圆柱面 h = contourslice(x, y, z, f, xi, yi, zi, [4 4]); % 绘制交线 set(h, 'EdgeColor', 'k', 'LineWidth', 5); % 强调交线

怎么样,这下看得清了吧?

总结一下:利用contourslice,可以绘制两个曲面的交线。

不过,这种方法有一个局限性,就是两个曲面必须分别以三元方程参数方程的形式给出。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3