1

関数をプロットしようとしています

f(x, y) = (x – 3).^2 – (y – 2).^2.

x は 2 から 4 までのベクトルで、y は 1 から 3 までのベクトルで、どちらも 0.2 ずつ増加します。ただし、次のエラーが表示されます。

「添え字のインデックスは、実数の正の整数または論理値のいずれかでなければなりません」。

このエラーを修正するにはどうすればよいですか?

4

3 に答える 3

4

あなたが達成しようとしていることがわかります。数学関数の定義のように構文を記述しています。Matlab はf2 次元データ型として解釈し、式の値を でインデックス付けされたデータに代入しようとしていますx,y。との値は整数xyはないため、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)と という関数を定義したいと述べています。行の残りの部分は、その関数の定義です。fxy

zの両方の関数としてプロットする場合は、範囲内のすべての可能な組み合わせを指定する必要があります。これが、コマンドを含む行の目的です。xyrepmat

編集

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');
于 2012-10-19T15:49:21.690 に答える
2

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.

于 2012-10-20T00:39:46.677 に答える
1

あなたの問題は、使用している関数が整数を使用しており、それに double を割り当てようとしていることです。整数に小数点以下の桁数を含めることはできません。これを修正するには、0.2 ではなく 1 ずつ増加するようにします。

于 2012-10-19T15:48:29.953 に答える