2012-10-19 50 views
1

我試圖繪製函數錯誤繪製2個變量

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

x的函數是從2至4的矢量,並且y爲從1到3的載體,兩者都具有0.2的增量。但是,我收到錯誤:

"Subscript indices must either be real positive integers or logicals".

我該如何解決此錯誤?

+0

如果您需要Matlab代碼的幫助,請發佈Matlab代碼,而不是一些近似值。 –

+0

另請參見[此問題](http://stackoverflow.com/questions/20054047/subscript-indices-must-either-be-real-positive-integers-or-logicals-generic-sol)[通用解決方案這個問題](http://stackoverflow.com/a/20054048/983722)。 –

回答

4

我(想)我明白你想達到什麼。你正在編寫你的語法就像一個數學函數定義。 Matlab正在將f解釋爲二維數據類型,並嘗試將表達式的值分配給編號爲x,y的數據。 xy的值不是整數,所以Matlab抱怨。

如果你想繪製函數的輸出(我們就叫它z)作爲xy一個功能,你需要完全不同的定義函數。 。 。

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

這會給你一個這樣的輸出。 。 。 enter image description here

第一線的f = @(x,y)部分指出要定義一個名爲f函數取變量xy。該行的其餘部分是該函數的定義。

如果您想將z作爲xy的函數繪圖,那麼您需要提供您範圍內的所有可能組合。這是包含repmat命令的行。

編輯

有一個整潔的MATLAB函數meshgrid,可替換的腳本repmat版本由@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'); 
1

你的問題是你正在使用的函數使用整數,而你試圖給它分配一個double。整數不能有小數位。要解決這個問題,你可以使它增加到1的位置,而不是0.2

2

我通常使用MESHGRID函數。像這樣:

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

這與@learnvst的答案相同。它只是爲你重新制作。

+0

+1是的,不錯的選擇:) – learnvst