2014-09-27 631 views
1

我正在嘗試在Matlab中進行四階嵌套集成。功能如下:Matlab集成錯誤:Integrand輸出大小與輸入大小不匹配

second_integral = @(r_dash, phi_dash, r, phi) ((exp(-1i * k * r_dash * cos(phi_dash) * sin(theta)) .* exp(-1i * k * sqrt(r.^2 + r_dash.^2 - 2*(r * r_dash .* cos (phi_dash - phi)))))/(2 .* pi .* sqrt(r.^2 + r_dash.^2 - 2.*(r .* r_dash .* cos (phi_dash - phi)))));   

有了這個特殊的例子所述常數:

a_1 = 7e-5; 
a_2 = 5e-5; 
k = 1; 
theta = 0; % can also be 0.5, 1, 1.5 

整合正在做的

integrated_second_integral =integral(@(r_dash)integral3(@(phi_dash,r,phi)second_integral(r_dash,phi_dash,r,phi),0,(2*pi),0,a_2,0,(2*pi)),0,a_1,'ArrayValued',true); 

當運行集成命令我得到出現以下錯誤:

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.725290e-19. 
> In @(r_dash,phi_dash,r,phi)((exp(-1i*k*r_dash*cos(phi_dash)*sin(theta)).*exp(-1i*k*sqrt(r.^2+r_dash.^2-2*(r*r_dash.*cos(phi_dash-phi)))))/(2.*pi.*sqrt(r.^2+r_dash.^2-2.*(r.*r_dash.*cos(phi_dash-phi))))) 
    In @(phi_dash,r,phi)second_integral(r_dash,phi_dash,r,phi) 
    In integral3>@(y,z)FUN(x(1)*ones(size(z)),y,z) at 139 
    In funfun/private/integral2Calc>integral2t/tensor at 229 
    In funfun/private/integral2Calc>integral2t at 56 
    In funfun/private/integral2Calc at 10 
    In integral3>innerintegral at 138 
    In funfun/private/integralCalc>iterateScalarValued at 314 
    In funfun/private/integralCalc>vadapt at 133 
    In funfun/private/integralCalc at 76 
    In integral3 at 122 
    In @(r_dash)integral3(@(phi_dash,r,phi)second_integral(r_dash,phi_dash,r,phi),0,(2*pi),0,a_2,0,(2*pi)) 
    In funfun/private/integralCalc>iterateArrayValued at 157 
    In funfun/private/integralCalc>vadapt at 131 
    In funfun/private/integralCalc at 76 
    In integral at 89 
    In this_matlab_script at 61 
Error using integral2Calc>integral2t/tensor (line 242) 
Integrand output size does not match the input size. 

Error in integral2Calc>integral2t (line 56) 
[Qsub,esub] = tensor(thetaL,thetaR,phiB,phiT); 

Error in integral2Calc (line 10) 
    [q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct); 

Error in integral3/innerintegral (line 138) 
     Q1 = integral2Calc(... 

Error in integralCalc/iterateScalarValued (line 314) 
       fx = FUN(t); 

Error in integralCalc/vadapt (line 133) 
      [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); 

Error in integralCalc (line 76) 
     [q,errbnd] = vadapt(@AtoBInvTransform,interval); 

Error in integral3 (line 122) 
    Q = integralCalc(@innerintegral,xmin,xmax,integralOptions); 

Error in 
@(r_dash)integral3(@(phi_dash,r,phi)second_integral(r_dash,phi_dash,r,phi),0,(2*pi),0,a_2,0,(2*pi)) 


Error in integralCalc/iterateArrayValued (line 157) 
       fxj = FUN(t(1)).*w(1); 

Error in integralCalc/vadapt (line 131) 
      [q,errbnd] = iterateArrayValued(u,tinterval,pathlen); 

Error in integralCalc (line 76) 
     [q,errbnd] = vadapt(@AtoBInvTransform,interval); 

Error in integral (line 89) 
Q = integralCalc(fun,a,b,opstruct); 

Error in this_matlab_script (line 61) 
     integrated_second_integral 
     =integral(@(r_dash)integral3(@(phi_dash,r,phi)second_integral(r_dash,phi_dash,r,phi),0,(2*pi),0,a_2,0,(2*pi)),0,a_1,'ArrayValued',true); 

這個錯誤的來源對我來說是一個完整的謎。有人可以好好闡述一下這裏可能發生的事情,以及我能做些什麼來補救它?

回答

2

拋出的錯誤來自integral2Calc()的tensor()函數中的第242行。在那裏放置一個斷點表明VTSTIDX和Z1之間確實存在大小不匹配。此外,還有以下提示:

% Check that FUN is properly vectorized. This is important here 
% because we (otherwise) always pass in square matrices, which 
% reduces the probability of the user generating an error by 
% using matrix functions instead of elementwise functions. 

看你的功能:在你的函數的某些部分使用的是R * r_dash,和其他地方使用R * r_dash。此外,使用/和*代替./和。*來分割或相乘矢量,而您使用。*與標量同時乘法。我建議你在這方面更加一致。

不管怎麼說,改變功能分爲:

second_integral = @(r_dash, phi_dash, r, phi) ((exp(-1i * k * r_dash .* cos(phi_dash) * sin(theta)) .* exp(-1i * k * sqrt(r.^2 + r_dash.^2 - 2*(r .* r_dash .* cos (phi_dash - phi))))) ./ (2 * pi * sqrt(r.^2 + r_dash.^2 - 2.*(r .* r_dash .* cos (phi_dash - phi))))); 

也不再給錯誤(而是很多很多很多的警告),但因爲我不是爲整合我不知道如果上述解決您的問題。

+0

你在這裏引用的「提示」,我是在解釋這個意思是說,對於傳遞給「積分」的函數「FUN(x)」,在積分處理中,方陣用於'x' ? – dbliss 2016-03-23 00:04:51