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

曲面和参数曲线显然是不一样的,但绘制曲面切片的思路是相同的。
发布于 2016-11-15 09:23:45
让我们从将函数定义为内联的向量化函数句柄开始:
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那么漂亮,但至少是等价的。

https://stackoverflow.com/questions/40605462
复制相似问题