The symbol "1" is not a scalar in integral3
30 views (last 30 days)
Show older comments
I can numerically evaluate a triple integral of a function like x.*y.*z. But when I try to integrate a constant function 1, I get errors. How do a signal to Matlab that 1 is a scalar. My goal is to compute a volume by doing a triple integral over a 0,1-function.
integral3(@(x,y,z) x.*y.*z, 0,1,0,1,0,1)
ans =
0.1250
>> integral3(@(x,y,z) 1, 0,1,0,1,0,1)
Error using integral2Calc>tensor (line 253)
Integrand output size does not match the input size.
Error in
integral2Calc>integral2t (line 55)
[Qsub,esub,FIRSTFUNEVAL,NFE] = tensor(thetaL,thetaR,phiB,phiT,[],[], ...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in
integral2Calc (line 9)
[q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in
integral3>innerintegral (line 128)
Q1 = integral2Calc( ...
^^^^^^^^^^^^^^^^^^
Error in
integral3>@(x)innerintegral(x,fun,yminx,ymaxx,zminxy,zmaxxy,integral2options) (line 111)
f = @(x)innerintegral(x, fun, yminx, ymaxx, ...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in
integralCalc>iterateScalarValued (line 334)
fx = FUN(t);
^^^^^^
Error in
integralCalc>vadapt (line 148)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen, ...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in
integralCalc (line 77)
[q,errbnd] = vadapt(vfunAB,interval, ...
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in
integral3 (line 113)
Q = integralCalc(f,xmin,xmax,integralOptions);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 Comment
Dyuman Joshi
on 20 Oct 2025 at 13:51
See the error message - "Integrand output size does not match the input size."
From the documentation - "The function fun must accept three arrays of the same size and return an array of corresponding values. It must perform element-wise operations."
When you define your function as -
f = @(x,y,z) 1;
It does not necessary accept three arrays of same size, and the output size is not always same as the input size.
@the cyclist shows an approach below on how to perform the integral.
Answers (2)
the cyclist
on 20 Oct 2025 at 13:35
Here is one way:
integral3(@(x,y,z) ones(size(x)), 0,1,0,1,0,1)
0 Comments
John D'Errico
on 20 Oct 2025 at 14:25
Edited: John D'Errico
on 20 Oct 2025 at 14:31
If ALL you want to do is compute a volume, especially of such a simple domain, there are better ways to do so. If the domain is a complicated one, then yes, integral3 will do so. But will it be fast? Not necessarily, as integral3 is not really targetted to solve that class of problem, even though you can make it work.
In this case, since the volume is a simple convex one, I'll use an alpha shape, with alpha set to inf.
xyz = dec2bin(0:7) - '0'
S = alphaShape(xyz,inf);
volume(S)
Essentially, as long as the domain can be dissected into a tessellated one, then any tool that can compute the volume of each simplex, then add them all up will suffice. You can find them all over, look on the File Exchange, I think I even have one up there.
@the cyclist has already shown how to solve the problem using integral3.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!