2016-11-15 92 views
1

我想在Matlab中用曲面上預定義的等高線生成曲面圖。我已經在Mathematica中生成了這個圖,並且希望在Matlab中創建相同的圖形。等高線和曲面的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] 

enter image description here

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

enter image description here

表面和參數曲線是明顯不一樣,但這個想法是繪製表面

的片相同
+0

告訴我們你得到了什麼!請添加你的嘗試,這不是一個編碼轉換服務!還有,Mathematica是什麼? –

+0

有時候是這樣,對不起:) –

+0

@DylanRichardMuir我希望你爲了樂趣而做到了!一般來說,我們不要過多地鼓勵人們粘貼他們的代碼。好的答案btw –

回答

2

讓我們從定義函數開始,如內聯矢量化函數句柄:

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是沒有足夠的智慧自動做離散數學一樣:

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那樣美麗,但至少相當於。

Surface plot with contour

+0

提示1:'caxis([0 20000])'。另外,我會說黑線應該有單個「Z」值。例如'plot3(vfLX,vfLY,zeros(size(vfLX)),'k - ');''或'plot3(vfLX,vfLY,ones(size(vfLX))* min(Zsurf),'k-') ;''Zsurf'表面的最小值 –

+0

很好的接收,謝謝 –

+0

無論如何,只是隨機提示,我喜歡MATLAB的情節:P –