等高线和曲面Matlab

Contour Line and Surface Matlab

我想在 Matlab 中生成一个表面有预定义等高线的表面图。我已经在 Mathematica 中制作了绘图,并想在 Matlab 中创建等效图形。

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

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];

和曲面上的参数化曲线

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];

然后我一起绘制曲面和等高线:

surf= Plot3D[-1/L1[G, V], {G, 10, 100}, {V, 0, 12}];
Show[surf, hike, hikeHeight, AxesLabel -> {G, V,Z}, Boxed -> False]

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

这是我的 matlab 尝试取得的进展

[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')

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

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

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 那样进行自动离散化:

nMeshPoints = 50;

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

好的,现在我们可以评估网格上的表面,并绘制表面图:

hSurf = surf(mfG, mfV, -1./l1(mfG, mfV));
shading interp;
hold on;
hSurf.FaceAlpha = 0.5;

现在我们需要构建和绘制您的参数线,同样通过显式离散化:

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-');

现在我们可以把剧情画得更漂亮一点:

xlim([10 100]);
ylim([0 12]);
zlim([0 20000]);
caxis([0 20000]); 
xlabel('G');
ylabel('V');
zlabel('Z');
view([60, 30]);

结果:不如 Mathematica 漂亮,但至少相当。