2013-05-19 142 views
0

我想用Matlab的dblquad來計算積分。要做到這一點,我首先寫了一個腳本函數。我的代碼是MatLab中的數值積分

function z = IntRect(x, y) 
%The variables 
z0=20; 
x0=15; 
y0=20; 
rl=sqrt(x.^2+y.^2+(z0/2)^2); 
theta=acos(z0./(2*rl)); 
phi=atan(y./x); 
%The function 
z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 
z=z/rl.^3; 

要計算數值積分我在命令窗口

z0=20;x0=15;y0=20; 
Q = dblquad(@IntRect,0,x0/2,0,y0/2,1.e-6); 

型我得到一個錯誤,說

??? Error using ==> mtimes 
Inner matrix dimensions must agree. 

Error in ==> IntRect at 8 
z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 

Error in ==> quad at 77 
y = f(x, varargin{:}); 

Error in ==> dblquad>innerintegral at 84 
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:}); 

Error in ==> quad at 77 
y = f(x, varargin{:}); 

Error in ==> dblquad at 60 
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ... 

我在做什麼不好呢?

編輯

更換

z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 

z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 

我得到一個新的錯誤

??? Index exceeds matrix dimensions. 

Error in ==> quad at 85 
if ~isfinite(y(7)) 

Error in ==> dblquad>innerintegral at 84 
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:}); 

Error in ==> quad at 77 
y = f(x, varargin{:}); 

Error in ==> dblquad at 60 
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ... 
+0

開始調試。第#8行中發生第一個錯誤的變量的維數是多少? – Schorsch

+0

@Schorsch:非常感謝您的評論。這是我不確定的事情......我知道這個問題在'theta'和'phi'變量的某個地方,但我無法確定。我所知道的是,它具有相同的尺寸。所以我在#8行使用了'phi'而不是'phi',但是我得到了完全相同的錯誤... – Thanos

回答

1

由於幫助dblquad說,輸入x是一個載體,y是一個標量和輸出z也向量。因此,您的被積函數中的任何函數是x的函數將是一個向量(例如,rl),您需要在適當的地方使用基於元素的運算符。最後一行你沒有這樣做。

另外,還要考慮通過函數句柄傳遞你的初始值的參數,而不是複製它們被積函數內部:

function dblquadtest 
z0 = 20; x0 = 15; y0 = 20; 
f = @(x,y)IntRect(x,y,x0,y0,z0); 
Q = dblquad(f,0,x0/2,0,y0/2); % 1e-6 is the default tolerance 

function z = IntRect(x, y, x0, y0, z0) 
%The variables 
rl=sqrt(x.^2+y.^2+(z0/2)^2); 
theta=acos(z0./(2*rl)); 
phi=atan(y./x); 
%The function 
z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 
z=z./rl.^3; 
+0

非常感謝您的回答!有用!這是你表示非常感謝的最後一行!但是我並不完全理解通過句柄函數傳遞初始值的部分。你是否暗示要創建一個新的函數'dblquadtest'並在命令提示符下運行這個函數? – Thanos

+0

這正是我在上面的回答中用變量'f'所做的。具體而言,'f'是一個[匿名函數](http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html),其中'''''''''''db''由'dblquad'傳入,因爲它當創建'f'時運行並且其他的被傳入一次。可以在M文件或Matlab命令窗口中創建匿名函數。 – horchler

2

你需要一個eleme NT-明智的運營商

z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4; 
          ^
           | 
+0

非常感謝您的回答!尺寸誤差確實消失了,但我仍然無法計算出積分。顯示的錯誤說。請檢查我更新的問題是否有錯誤。謝謝! – Thanos

+0

@Thanos - 請相應更新問題,無法閱讀評論。您可能想要考慮新問題的新問題... – Shai