首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等高线与曲面Matlab

等高线与曲面Matlab
EN

Stack Overflow用户
提问于 2016-11-15 08:48:18
回答 1查看 704关注 0票数 1

在Matlab中,我想要生成一个表面上有一个预定义轮廓线的曲面图。我已经用Mathematica制作了这幅图,并想要在Matlab中创建一个等价的图形。

使用以下函数,我定义了一个曲面

代码语言:javascript
复制
k2[G_, V_] = Sqrt[G]*Exp[-V];
k1[G_] = Sqrt[G]*Exp[-10];
L1[G_, V_] = -0.5*(k1[G_] + 2*k2[G, V]) + 0.5*Sqrt[k1[G_]^2 + 4*k2[G, V]^2];

以及曲面上的参数曲线

代码语言:javascript
复制
hike=ParametricPlot3D[{10, 0, 0} + {x^2, x, -(1/L1[10 + x^2, x])}, {x, 0, 12},PlotStyle -> Directive[Thick, Red]];
hikeHeight=ParametricPlot3D[{10, 0, 0} + {x^2,x, -z*(1/L1[10 + x^2, x])}, {x, 0, 12}, {z, 0, 1},PlotStyle -> Directive[Gray], Mesh -> None];

然后我把表面和轮廓线画在一起:

代码语言:javascript
复制
surf= Plot3D[-1/L1[G, V], {G, 10, 100}, {V, 0, 12}];
Show[surf, hike, hikeHeight, AxesLabel -> {G, V,Z}, Boxed -> False]

在Matlab中评估函数并生成相同的图的过程是什么?

这就是我在matlab的尝试中取得的成就。

代码语言:javascript
复制
[X,Y,Z] = peaks(25);
curvX=diag(X);
curvY=diag(Y);
curvZ=diag(Z);

nn = 401;
xi = linspace(-3.0, 3.0, nn);
yi = xi;
[xi, yi] = meshgrid(xi, yi);
zi = interp2(X, Y, Z, xi, yi, 'spline');

figure()
surf(xi, yi, zi,'LineStyle', 'none', 'FaceColor', 'interp')
colormap(parula)
alpha 0.7
hold on
surf(diag(curvX),diag(curvY),diag(curvZ),'LineStyle', 'none')

曲面和参数曲线显然是不一样的,但绘制曲面切片的思路是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 09:23:45

让我们从将函数定义为内联的向量化函数句柄开始:

代码语言:javascript
复制
k2 = @(g, v)sqrt(g).*exp(-v);
k1 = @(g)sqrt(g).*exp(-10);
l1 = @(g, v) -.5 .* (k1(g) + 2.*k2(g, v)) + 0.5 * sqrt(k1(g).^2 + 4.*k2(g, v).^2);

现在我们需要定义一个网格,因为Matlab不够聪明,不能像Mathematica那样进行自动离散化:

代码语言:javascript
复制
nMeshPoints = 50;

vfG = linspace(10, 100, nMeshPoints);
vfV = linspace(0, 12, nMeshPoints);
[mfG, mfV] = ndgrid(vfG, vfV);

好的,现在我们可以对网格上的表面进行评估,并绘制一个曲面图:

代码语言:javascript
复制
hSurf = surf(mfG, mfV, -1./l1(mfG, mfV));
shading interp;
hold on;
hSurf.FaceAlpha = 0.5;

现在,我们需要构建和绘制参数线,也可以通过显式离散:

代码语言:javascript
复制
vfX = linspace(0, 12, nMeshPoints);
vfZ = linspace(0, 1, nMeshPoints);

vfLX = 10 + vfX.^2;
vfLY = vfX;
vfLZ = -(1 ./ l1(10 + vfX.^2, vfX));

vfLHeight = vfLZ .* vfZ;

plot3(vfLX, vfLY, vfLZ, 'r-');
plot3(vfLX, vfLY, vfLHeight, 'k-');

现在我们可以让情节更美了:

代码语言:javascript
复制
xlim([10 100]);
ylim([0 12]);
zlim([0 20000]);
caxis([0 20000]); 
xlabel('G');
ylabel('V');
zlabel('Z');
view([60, 30]);

其结果是:不像Mathematica那么漂亮,但至少是等价的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40605462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档