このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
fsurf
3 次元表面のプロット
構文
説明
fsurf(
は、f
,[xmin xmax ymin ymax]
)f(x,y)
を x
の区間 [xmin xmax]
と y
の区間 [ymin ymax]
でプロットします。関数 fsurf
は symvar
を使用して、変数を並べ替え、区間を割り当てます。
fsurf(
は、パラメトリックな表面 funx,funy,funz
)x = x(u,v)
、y = y(u,v)
、z = z(u,v)
を、u
と v
の区間 [-5 5]
でプロットします。
fsurf(
は、パラメトリックな表面 funx,funy,funz
,[uvmin uvmax]
)x = x(u,v)
、y = y(u,v)
、z = z(u,v)
を、u
と v
の区間 [uvmin uvmax]
でプロットします。
fsurf(
は、パラメトリックな表面 funx,funy,funz
,[umin umax vmin vmax]
)x = x(u,v)
、y = y(u,v)
、z = z(u,v)
を、u
の区間 [umin umax]
と v
の区間 [vmin vmax]
でプロットします。関数 fsurf
は symvar
を使用して、パラメトリック変数を並べ替え、区間を割り当てます。
fsurf(___,
は、1 つ以上の Name,Value
)Name,Value
引数ペアを使用して、ラインのプロパティを指定します。このオプションは、前述の構文のすべての入力引数の組み合わせの後で使用できます。
fsurf(
は、現在の axes オブジェクト ax
,___)gca
ではなくオブジェクト ax
をもつ座標軸にプロットします。
は、表面のタイプによって、関数表面オブジェクトまたはパラメーター化された関数表面オブジェクトを返します。このオブジェクトを使用して、特定の表面のプロパティのクエリと変更を行います。詳細は FunctionSurface のプロパティ および ParameterizedFunctionSurface のプロパティ を参照してください。fs
= fsurf(___)
例
シンボリック式の 3 次元表面プロット
入力 を既定の範囲 および にわたってプロットします。
syms x y fsurf(sin(x)+cos(y))
シンボリック関数の 3 次元表面プロット
の実数部を既定の範囲 および にわたってプロットします。
syms f(x,y)
f(x,y) = real(atan(x + i*y));
fsurf(f)
表面プロットのプロット区間の指定
プロット区間を fsurf
の 2 番目の引数に与えることで、 を区間 と にプロットします。
syms x y f = sin(x) + cos(y); fsurf(f, [-pi pi -5 5])
パラメーター化された表面プロット
次のパラメーター化された表面のプロットを
と で行います。
camlight
を使用してプロットの外観を改善します。
syms s t r = 2 + sin(7*s + 5*t); x = r*cos(s)*sin(t); y = r*sin(s)*sin(t); z = r*cos(t); fsurf(x, y, z, [0 2*pi 0 pi]) camlight view(46,52)
区分的式の表面プロット
クラインの壺の区分的式のプロット
と で行います。
クラインの壺には片側の表面しかないことを示します。
syms u v; r = @(u) 4 - 2*cos(u); x = piecewise(u <= pi, -4*cos(u)*(1+sin(u)) - r(u)*cos(u)*cos(v),... u > pi, -4*cos(u)*(1+sin(u)) + r(u)*cos(v)); y = r(u)*sin(v); z = piecewise(u <= pi, -14*sin(u) - r(u)*sin(u)*cos(v),... u > pi, -14*sin(u)); h = fsurf(x,y,z, [0 2*pi 0 2*pi]);
タイトルと座標軸ラベルの追加、および目盛りの書式設定
と について から まで、3 次元表面 をプロットします。タイトルと座標軸ラベルを追加します。
x 軸の範囲を pi/2
の間隔にして、x 軸の目盛りを作成します。round
を使用して座標軸の範囲を pi/2
の倍数に正確に変換し、S
の目盛りのシンボリックな値を取得します。XTick
プロパティを使用して、これらの目盛りを表示します。arrayfun
を使用して texlabel
を S
に適用して、x 軸ラベルを作成します。XTickLabel
プロパティを使用して、これらのラベルを表示します。以上の手順を、y 軸について繰り返します。
プロットに LaTeX を使用する方法については、latex
を参照してください。
syms x y fsurf(y.*sin(x)-x.*cos(y), [-2*pi 2*pi]) title('ysin(x) - xcos(y) for x and y in [-2\pi,2\pi]') xlabel('x') ylabel('y') zlabel('z') ax = gca; S = sym(ax.XLim(1):pi/2:ax.XLim(2)); S = sym(round(vpa(S/pi*2))*pi/2); ax.XTick = double(S); ax.XTickLabel = arrayfun(@texlabel,S,'UniformOutput',false); S = sym(ax.YLim(1):pi/2:ax.YLim(2)); S = sym(round(vpa(S/pi*2))*pi/2); ax.YTick = double(S); ax.YTickLabel = arrayfun(@texlabel,S,'UniformOutput',false);
表面プロットのライン スタイルおよび幅
の異なる値に対し異なるライン スタイルを使用して、パラメトリックな表面 、、 をプロットします。 に対しては、緑のドット マーカー付きの破線を使用します。 に対しては、LineWidth
に 1
を、面の色に緑を使用します。 について、EdgeColor
を none
に設定してラインを非表示にします。
syms s t fsurf(s*sin(t),-s*cos(t),t,[-5 5 -5 -2],'--.','MarkerEdgeColor','g') hold on fsurf(s*sin(t),-s*cos(t),t,[-5 5 -2 2],'LineWidth',1,'FaceColor','g') fsurf(s*sin(t),-s*cos(t),t,[-5 5 2 5],'EdgeColor','none')
表面の作成後の変更
パラメトリックな表面をプロットします
fcontour
がプロット オブジェクトを返すように出力を指定します。
syms u v x = exp(-abs(u)/10).*sin(5*abs(v)); y = exp(-abs(u)/10).*cos(5*abs(v)); z = u; fs = fsurf(x,y,z)
fs = ParameterizedFunctionSurface with properties: XFunction: exp(-abs(u)/10)*sin(5*abs(v)) YFunction: exp(-abs(u)/10)*cos(5*abs(v)) ZFunction: u EdgeColor: [0 0 0] LineStyle: '-' FaceColor: 'interp' Show all properties
fs
の URange
プロパティを使用して u
の範囲を [-30 30]
に変更します。EdgeColor
プロパティを使用してラインの色を青に設定し、Marker
プロパティと MarkerEdgeColor
プロパティを使用して白色のドット マーカーを指定します。
fs.URange = [-30 30]; fs.EdgeColor = 'b'; fs.Marker = '.'; fs.MarkerEdgeColor = 'w';
複数の表面プロットおよび透明な表面
fsurf
へのベクトル入力を使用して複数の表面をプロットします。または、hold on
を使用して、連続して同じ Figure にプロットします。同じ Figure に複数の表面を表示する場合、透明度が有用です。FaceAlpha
プロパティを使用して表面プロットの透明度を調整します。FaceAlpha
は、0
から 1
の値を取ります。0
は完全な透明で、1
は不透明です。
fsurf
へのベクトル入力を使用して平面 および をプロットします。FaceAlpha
を使用して平面を半透明にし、両方の平面を表示します。
syms x y h = fsurf([x+y x-y]); h(1).FaceAlpha = 0.5; h(2).FaceAlpha = 0.5; title('Planes (x+y) and (x-y) at half transparency')
表面プロットの解像度の制御
'MeshDensity'
オプションを使用して、表面プロットの解像度を制御します。'MeshDensity'
を増やすとプロットがより滑らかで正確になり、減らすとプロット速度が上がります。
subplot
を使用して、Figure を 2 つに分割します。最初のサブプロットでは、パラメトリックな表面 、、および をプロットします。表面には大きなギャップがあります。第 2 サブプロットで 'MeshDensity'
を 40
に増やしてこの問題を修正します。fsurf
によってギャップが埋められます。これは、'MeshDensity'
を増やすとプロットの解像度が向上することを示します。
syms s t subplot(2,1,1) fsurf(sin(s), cos(s), t/10.*sin(1./s)) view(-172,25) title('Default MeshDensity = 35') subplot(2,1,2) fsurf(sin(s), cos(s), t/10.*sin(1./s),'MeshDensity',40) view(-172,25) title('Increased MeshDensity = 40')
表面プロットより下の等高線の表示
'ShowContours'
オプションを 'on'
に設定して、式 f
の表面プロットに対して等高線を表示します。
syms x y f = 3*(1-x)^2*exp(-(x^2)-(y+1)^2)... - 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)... - 1/3*exp(-(x+1)^2 - y^2); fsurf(f,[-3 3],'ShowContours','on')
表面プロットのアニメーションの作成
アニメーションを作成するには、表示されている式を Function
、XFunction
、YFunction
および ZFunction
のプロパティを使用して変更した後、drawnow
を使用してプロットを更新します。GIF にエクスポートする方法については、imwrite
を参照してください。
変数 i を 1 から 3 まで変えることによって、パラメトリックな表面をアニメーション化します。
範囲は -0.1 < u < 0.1 および 0 < v < 1 とします。MeshDensity
を 9
に減らしてプロット速度を上げます。
syms s t h = fsurf(t.*sin(s), cos(s), sin(1./s), [-0.1 0.1 0 1]); h.MeshDensity = 9; for i=1:0.05:3 h.ZFunction = sin(i./s); drawnow end
表面プロットの外観の改善
関数のシンボリック式 f
を作成します。
f
式を表面としてプロットします。fsurf
によって返されるハンドルのプロパティ、ライティング プロパティおよび colormap
を使用して、表面プロットの外観を改善します。
camlight
を使用してライトを作成します。brighten
を使用して輝度を上げます。EdgeColor
を 'none'
に設定してラインを削除します。AmbientStrength
を使用して周囲光の強度を高めます。詳細は、ライティング、透明度、およびシェーディングを参照してください。座標軸のボックスをオンにします。タイトルについては、latex
を使用して f
を LaTeX に変換します。最後に、座標軸の目盛り、座標軸のラベルおよびタイトルの外観を改善するために、'Interpreter'
を 'latex'
に設定します。
syms x y f = 3*(1-x)^2*exp(-(x^2)-(y+1)^2)... - 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)... - 1/3*exp(-(x+1)^2 - y^2); h = fsurf(f,[-3 3]); camlight(110,70) brighten(0.6) h.EdgeColor = 'none'; h.AmbientStrength = 0.4; a = gca; a.TickLabelInterpreter = 'latex'; a.Box = 'on'; a.BoxStyle = 'full'; xlabel('$x$','Interpreter','latex') ylabel('$y$','Interpreter','latex') zlabel('$z$','Interpreter','latex') title_latex = ['$' latex(f) '$']; title(title_latex,'Interpreter','latex')
制限付き平面をもつ表面プロット
平面で下を、 平面で上を区切られた円筒シェルをプロットします。
syms r t u fsurf(cos(t),sin(t),u*(cos(t)+2),[0 2*pi 0 1]) hold on;
平面 の表面プロットを追加します。
fsurf(r*cos(t),r*sin(t),r*cos(t)+2,[0 1 0 2*pi])
表面プロットへの回転と平行移動の適用
トーラスの表面プロットに回転と平行移動を適用します。
トーラスはパラメトリックに次のように定義できます。
ここで、
は極角、 は方位角です。
はチューブの半径です。
はチューブの中心からトーラスの中心までの距離です。
および の値をそれぞれ 1 および 5 に定義します。fsurf
を使用してトーラスをプロットします。
syms theta phi a = 1; R = 4; x = (R + a*cos(theta))*cos(phi); y = (R + a*cos(theta))*sin(phi); z = a*sin(theta); fsurf(x,y,z,[0 2*pi 0 2*pi]) hold on
トーラスに 軸周りの回転を適用します。回転行列を定義します。トーラスを 90 度または ラジアンの角度で回転します。
alpha = pi/2; Rx = [1 0 0; 0 cos(alpha) -sin(alpha); 0 sin(alpha) cos(alpha)]; r = [x; y; z]; r_90 = Rx*r;
トーラスの中心を、 軸に沿って 5 シフトします。既存のグラフに、回転し平行移動したトーラスの 2 番目のプロットを追加します。
fsurf(r_90(1)+5,r_90(2),r_90(3))
axis([-5 10 -5 10 -5 5])
hold off
入力引数
出力引数
アルゴリズム
fsurf
は f
のシンボリック変数を x
軸に、次に y
軸に割り当て、symvar
は割り当てられる変数の順番を決定します。そのため、変数名と軸名が対応しない場合があります。fsurf
が x または y を対応する軸に割り当てるように強制するには、プロットするシンボリック関数を作成し、そのシンボリック関数を fsurf
に渡します。
たとえば、次のコードは f(x,y) = sin(y) を 2 つの方法でプロットします。1 つ目の方法では、y 軸に対して波形を振動させます。2 つ目の方法では、y を x 軸に割り当てます。これがシンボリック関数内で最初の (および唯一の) 変数であるためです。
syms x y; f(x,y) = sin(y); figure; subplot(2,1,1) fsurf(f); subplot(2,1,2) fsurf(f(x,y)); % Or fsurf(sin(y));

バージョン履歴
R2016a で導入