Trouble when using dblquad for product of functions
Ältere Kommentare anzeigen
Hello, I am using dblquad to integrate a function based on some parameters. Here is the call inside of a script file
for j = 1:4
for i = 1:4
dtemp(i,j) = dblquad('integrand',(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h),[],@QUADL,1,i,j,h);
dtemp(i,j) = dtemp(i,j) - dblquad('integrand',(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h),[],@QUADL,2,i,j,h);
end
end
The first couple of possible integrands from the 'integrand' function are
function [ g ] = integrand(x, y, var,i, j, h)
a = 1.040394;
b = 0.064362;
H = a/(b*sqrt(2*pi))*exp(-(x-y).^2/(2*b^2));
if (var == 1)
if (i == 1)
if ( j == 1)
g = ( 6*x/h^2 + 6*x.^2/h^3).*( 6*x/h^2 + 6*x.^2/h^3).*H;
end
if ( j == 2)
g = ( 6*x/h^2 + 6*x.^2/h^3).*(1 - 4*x/h + 3*x.^2/h^2).*H;
end
if ( j == 3)
g = ( 6*x/h^2 + 6*x.^2/h^3).*(6*x/h^2 - 6*x.^2/h^3).*H;
end
if ( j == 4)
g = ( 6*x/h^2 + 6*x.^2/h^3).*(-2*x/h + 3*x.^2/h^2).*H;
end
end
if (i == 2)
if (j == 1)
g = (1 - 4*x/h + 3*x.^2/h^2).*( 6*x/h^2 + 6*x.^2/h^3).*H;
end
if (j == 2)
g = (1 - 4*x/h + 3*x.^2/h^2).*(1 - 4*x/h + 3*x.^2/h^2).*H;
end
if (j == 3)
g = (1 - 4*x/h + 3*x.^2/h^2).*(6*x/h^2 - 6*x.^2/h^3).*H;
end
if (j == 4)
g = (1 - 4*x/h + 3*x.^2/h^2).*(-2*x/h + 3*x.^2/h^2).*H;
end
end
.
.
.
.
So the output matrix dtemp should ultimately be symmetric, however it is not, any ideas? Thank you for your time and help.
-Jonathan
5 Kommentare
Mike Hosea
am 6 Nov. 2013
Bearbeitet: Mike Hosea
am 6 Nov. 2013
You've provided enough information for me to compare the integrand when var = 1, i = 1, j = 2 to var = 1, i = 2, j = 1, but I can't see what the corresponding var = 2 versions look like.
Note that DBLQUAD is obsolete. The new routine is called INTEGRAL2. To use it you will need to reformulate your call sites a little bit. Instead of
dtemp(i,j) = dblquad('integrand',(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h),[],@QUADL,var,i,j,h);
you would write
dtemp(i,j) = integral2(@(x,y)integrand(x,y,var,i,j,h),(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h));
Mike Hosea
am 6 Nov. 2013
Bearbeitet: Mike Hosea
am 6 Nov. 2013
Unless your version is very old, you can probably use QUAD2D instead of INTEGRAL2 for this problem.
for j = 1:4
for i = 1:4
dtemp(i,j) = quad2d(@(x,y)integrand(x,y,1,i,j,h),(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h));
dtemp(i,j) = dtemp(i,j) - quad2d(@(x,y)integrand(x,y,2,i,j,h),(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h));
end
end
Jonathan
am 8 Nov. 2013
Mike Hosea
am 8 Nov. 2013
Bearbeitet: Mike Hosea
am 8 Nov. 2013
Well, QUAD2D is fast enough that you can probably afford to crank down the tolerances. Do this like
dtemp(i,j) = quad2d(@(x,y)integrand(x,y,1,i,j,h),(0+(m)*h),(0+(m+1)*h),(0+(m)*h),(0+(m+1)*h),'AbsTol',100*eps,'RelTol',100*eps);
Generally you want to set AbsTol to something that is small enough to be considered essentially zero. A reltol of 100*eps = 2.2e-14 should give you about 13 significant digits, give or take, unless the answer gets close to zero, in which case reltol doesn't matter, only abstol. (Conversely, if the answer is not close to zero, abstol doesn't matter very much, only reltol).
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Data Distribution Plots finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!