Resources

Integration over user defined function in GAUSS

0

Hi,

I wanted to know whether there is a way to calculate one dimensional integral over an user defined function in GAUSS. I see than intquad2 and intquad3 can respectively be used for two and three dimensional integral, is there an option for one dimensional integration (not over a rectangular distribution, but over an user defined distribution).

I would appreciate your response in this regard.

 

Thanks and Regards

Annesha

 

asked August 14, 2014

5 Answers

0

The simplest method would be to use function intquad1 to calculate a one dimensional integral for example:

range_end = 1;
range_start = 0;
area = intquad1(&myProc, range_end|range_start);

proc (1) = myProc(x);
   retp(x .* sin(x));
endp;

The other option is to use inthp4. Here is an example. You can keep the wrapper function simpleInthp41d if you want and just call that function to make it simpler to use.

area = simpleInthp1D(&myProc, 0, 1);

proc (1) = myProc(struct DS *data, x);
   //If your function needs data other than from 'x'
      //you can pull it from the 'data' struct like this
      //new_var = data->dataMatrix;
   retp(x .* sin(x));
endp;

proc (1) = simpleInthp1D(fct, range_start, range_end);
   local fct:proc, area_;
	
   //Declare control structure and fill
   //in defaults
   struct inthpControl ctl;
   ctl = inthpControlCreate();

   //Make any control structure changes here
   //For example:
   //ctl.eps = 1e-5;
	
   //Declare and DS structure for any extra data
   struct DS d0;
   d0 = dsCreate();
	
   lim = range_end|range_start;
	
   //Call integration routine
   area_ = inthp4(&fct, &d0, ctl, lim);
   retp(area_);
endp;
aptech
352
0

Hello Please correct me if I am wrong, but in your examples isn't the integration is being done over a rectangular region. For example in your first example isn't it the assumption that x is uniformly distributed between 0 and 1?

What I want to do is I want to define a distribution for x other than rectangular, there are are options to do that for two/three dimensional integrals using intquad2 and intquad3, but I do not know how to use that in one dimenssinal case.

Look forward to your help.

 

Regards

Annesha

 

 

 

0

I am confused. When I first read your question, I was assuming that you simply wanted to calculate the area under the curve of a user defined function. For example, let's say the area under the curve of the sin function between 0 and 1.

Are you wanting to perform a double integral over a non-rectangular region as illustrated in slide number 2 at this link? http://www.math.ust.hk/~malwu/math100/lecture15.pdf

If not, could you point me to something that explains what you are trying to do?

aptech
352
0

Hello,

I do not want to do a double integral.

Let me try to explain what I want to do:

If g(.) is a function of x and f(.) is the pdf (probability density function of x), then all I want to do is to calculate the expected value of the function g(.) with respect to x, and the formula for doing this is

\operatorname{E}[g(X)] = \int_{-\infty}^\infty g(x) f(x)\, \mathrm{d}x .

And also as I mentioned previously, I want to define both g(x) and the pdf, f(x). Hope its a little less ambiguous now.

I would appreciate your help in this regard.

Regards

Annesha

 

 

0

Finding expected value of a continuous function of a random variable
ExpectedValueRVFunc that works through an example analytically using the a uniform distribution function explicitly. Below is the code that corresponds to the analytical solution from the attachment.

//Main code
area = inthp4Simple(&myProc, 0, 10);
print area;

//User define procedures
proc (1) = pdfu(x, range_start, range_end);
   retp(1./(range_end - range_start));
endp;

proc (1) = myProc(struct DS *data, x);
   local range_end, range_start;
   //If your function needs data other than from 'x'
   //you can pull it from the 'data' struct like this
   range_start = data->dataMatrix[1];
   range_end = data->dataMatrix[2];
   retp(x .* x .* pdfu(x, range_start, range_end));
endp;

//Main helper procedure for reuse
proc (1) = inthp4Simple(fct, range_start, range_end);
   local fct:proc, area_, lim;
	
   //Declare control structure and fill
   //in defaults
   struct inthpControl ctl;
   ctl = inthpControlCreate();

   //Make any control structure changes here
   //For example:
   //ctl.eps = 1e-5;

   //Declare and DS structure which will
   //pass extra data to 'pdfu' function
   struct DS d0;
   d0 = dsCreate();
   //Passing range so it can be sent to 'pdfu'
   d0.dataMatrix = range_start|range_end;
	
   lim = range_end|range_start;

   //Call integration routine
   area_ = inthp4(&fct, &d0, ctl, lim);
   retp(area_);
endp;

If we make a couple of changes to the code above, we can make it work for an infinite integral and a non-uniform distribution. Here is an example using the normal distribution. You would replace pdfn with your probability density function:

//Main code
area = inthp4Simple(&myProc);
print area;

//User define procedure
proc (1) = myProc(struct DS *data, x);
   retp(.*pdfn(x));
endp;

//Main helper procedure for reuse
proc (1) = inthp4Simple(fct);
   local fct:proc, area_, lim;
	
   //Declare control structure and fill
   //in defaults
   struct inthpControl ctl;
   ctl = inthpControlCreate();
	
   //Declare and DS structure which will
   //pass extra data to 'pdfu' function
   struct DS d0;
   d0 = dsCreate();

   //Call integration routine
   //'inthp1' calculates an integral over
   //an infinite interval
   area_ = inthp1(&fct, &d0, ctl);
retp(area_);
endp;
aptech
352