Numerical integration with quadcc

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Numerical integration with quadcc

BGreen
My problem is that I get the error "integrand F must return a single,
real-valued vector of the same size as the input" even when the integrand
DOES return such a vector. I am using quadcc because I have infinite limits
of integration and a piecewise-defined integrand. Things will execute
correctly if I just use quad, but I'm not sure whether or not the answer
will be trustworthy since the documentation recommends other integrators for
infinite bounds and nonsmooth functions.

I call the following within a function:

Vsame = @(x) Vsame_fit(x./lB);
F0011 = @(x) (1-(x.^2)/2).*exp(-(x.^2./2));
integ_F0011same = @(x) F0011(x).*Vsame(x);
integ_F0011same(linspace(1,3,10))
Fsame(1,1,2,2) = quadcc(integ_F0011same,0,Inf);

I defined the constant lB elsewhere. Outside that function I have defined
Vsame_fit:

function y = Vsame_fit(q)
    for k=1:length(q)
        if q(k)<0.022913
            y(k) = 0.98*tanh(200*q(k));
        elseif q(k)<0.50274
            y(k) = 1/(0.9*q(k)+1);
        elseif q(k)<21.598
            y(k) = 1/(1.046*q(k)+0.9266);
        else
            y(k) = 1/(0.9512*q(k)+2.89);
        end
    end
end

I wrote the loop over the length of the argument to ensure that it would
return a vector. Furthermore, if I call something simple as a test like

integ_F0011same(linspace(1,3,10))

inside the function, a 10-element is returned as expected. Why am I getting
this error?



At the end of the day, I just want to have the value of the integral which I
was hoping would be saved to Fsame(1,1,2,2). The reason I have defined
things with so many separate functions, however, is that I reuse Vsame three
more times to evaluate similar integrals, e.g.

integ_F0110same = @(x) F0110(x).*Vsame(x);
Fsame(1,2,2,1) = quadcc(integ_F0110same,0,Inf);

where F011(x) was also defined with a function handle. Is there a better way
I should be doing this?



--
Sent from: http://octave.1599824.n4.nabble.com/Octave-General-f1599825.html


Reply | Threaded
Open this post in threaded view
|

Re: Numerical integration with quadcc

Carlo de Falco-2
Hi,

> Il giorno 07 giu 2019, alle ore 21:25, BGreen <[hidden email]> ha scritto:
>
> My problem is that I get the error "integrand F must return a single,
> real-valued vector of the same size as the input" even when the integrand
> DOES return such a vector.
...
> I wrote the loop over the length of the argument to ensure that it would
> return a vector. Furthermore, if I call something simple as a test like
>
> integ_F0011same(linspace(1,3,10))
>
> inside the function, a 10-element is returned as expected. Why am I getting
> this error?


I am not 100% sure this is the problem but I suspect the relevant part of the error

"integrand F must return a single, real-valued vector of the same size as the input"

message is

"of the same size as the input"

with your specific test it works, but if you try for example :

  integ_F0011same (ones(7,1))

the output does not have the same shape and size of input ...

Hope this helps,
c.