As the help for dblquad
says, the input x
is a vector and y
is a scalar and the output z
is also vector. Thus anything in your integrand function that is a function of x
will be a vector (e.g., rl
) and you'll need to be careful to use element-wise operators where appropriate. You did not do this for the very last line.
Also, consider passing your initial value parameters via function handle rather than duplicating them inside the integrand function:
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;