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
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;
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?
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
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;
Your Answer
5 Answers
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;
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
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?
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
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
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;