関数をプロットしようとしています
f(x, y) = (x – 3).^2 – (y – 2).^2.
x は 2 から 4 までのベクトルで、y は 1 から 3 までのベクトルで、どちらも 0.2 ずつ増加します。ただし、次のエラーが表示されます。
「添え字のインデックスは、実数の正の整数または論理値のいずれかでなければなりません」。
このエラーを修正するにはどうすればよいですか?
あなたが達成しようとしていることがわかります。数学関数の定義のように構文を記述しています。Matlab はf
2 次元データ型として解釈し、式の値を でインデックス付けされたデータに代入しようとしていますx,y
。との値は整数x
でy
はないため、Matlab は文句を言います。
z
関数 ( と呼びます)の出力をx
との関数としてプロットしたい場合はy
、関数をまったく別の方法で定義する必要があります。. .
f = @(x,y)(x-3).^2 - (y-2).^2;
x=2:.2:4;
y=1:.2:3;
z = f( repmat(x(:)',numel(y),1) , repmat(y(:),1,numel(x) ) );
surf(x,y,z);
xlabel('X'); ylabel('Y'); zlabel('Z');
これにより、次のような出力が得られます。. .
最初の行の部分は、変数を取るf = @(x,y)
と という関数を定義したいと述べています。行の残りの部分は、その関数の定義です。f
x
y
とz
の両方の関数としてプロットする場合は、範囲内のすべての可能な組み合わせを指定する必要があります。これが、コマンドを含む行の目的です。x
y
repmat
編集
meshgrid
@basによって提案されたスクリプトのrepmatバージョンを置き換えることができるきちんとしたMatlab関数があります(ようこそbas、basの回答までスクロールして+1してください!)...
f = @(x,y)(x-3).^2 - (y-2).^2;
x=2:.2:4;
y=1:.2:3;
[X,Y] = meshgrid(x,y);
surf(x,y,f(X,Y));
xlabel('x'); ylabel('y'); zlabel('z');
I typically use the MESHGRID function. Like so:
x = 2:0.2:4;
y = 1:0.2:3;
[X,Y] = meshgrid(x,y);
F = (X-3).^2-(Y-2).^2;
surf(x,y,F);
xlabel('x');ylabel('y');zlabel('f')
This is identical to the answer by @learnvst. it just does the repmat-ing for you.
あなたの問題は、使用している関数が整数を使用しており、それに double を割り当てようとしていることです。整数に小数点以下の桁数を含めることはできません。これを修正するには、0.2 ではなく 1 ずつ増加するようにします。