Numerical integration - optimisation of code

Click For Summary

Discussion Overview

The discussion revolves around optimizing numerical integration for a non-analytic function resembling a Gaussian curve. Participants explore methods to accurately compute the area under approximately 1,000 curves in real-time, addressing challenges related to computational efficiency and integration techniques.

Discussion Character

  • Exploratory
  • Technical explanation
  • Debate/contested

Main Points Raised

  • Mike describes the need for efficient area calculation under a non-analytic curve and mentions the current method using a regular grid, which is time-consuming.
  • Some participants suggest avoiding a regular grid and recommend exploring Gaussian quadrature as a more efficient integration method.
  • There is a discussion about the symmetry of the function, with suggestions to integrate half the domain if the function is symmetric.
  • Concerns are raised regarding the performance of MATLAB, with claims that it is significantly slower than C or Fortran for numerical computations.
  • One participant emphasizes the availability of C/C++ compilers and encourages Mike to consider using MATLAB's built-in numerical quadrature routines, including Gaussian quadrature, to leverage existing tools.

Areas of Agreement / Disagreement

Participants generally agree on the inefficiency of using a regular grid and the potential benefits of Gaussian quadrature. However, there is no consensus on the necessity or feasibility of switching programming languages, as Mike expresses a need to work within MATLAB.

Contextual Notes

Limitations include the dependence on the specific properties of the function being integrated, such as symmetry, and the unresolved performance issues related to MATLAB versus other programming languages.

mikeph
Messages
1,229
Reaction score
18
Hello

I have a function which is very similar in shape to a Gaussian, except it is not a distribution and it is not analytic, so I can at best calculate a single point on the curve at a time. (In general it is a convolution of different distributions but this is not important).

I need to find the area under this curve accurately, using the least amount of calculations (I need to find the area under ~1,000 curves and right now it is taking about 5 seconds per curve to get within about 1% accuracy, ideally the code needs to perform this in real time! ).My first try was to use a regular grid, eg. -10:0.01:10 for 2001 points, then the area (under)approximated by the sum of the values/100, the resolution. Varying the range and resolution of integration get me close to the "true" value but it takes too long, and I think I am wasting high resolution on the tail.
My next idea for optimisation is to have a grid which has more resolution at the areas of highest slope (does this make mathematical sense? I think...). I am having trouble justifying this and do not really know where to begin to implement it.

If anyone could point me to the right direction, I am sure this has been done before.

Regards,
Mike
 
Physics news on Phys.org
Some suggestions:
  • Don't use a regular grid. Look into something like Gaussian quadrature.
  • Is the function symmetric? If so, find the center and integrate half of the domain.
  • That you said "-10:0.01:10" suggests you are doing this in Matlab. Matlab is 10-100 times slower than C or Fortran.
 
Added clarification to 2nd bullet in case it wasn't obvious to the OP.
D H said:
Some suggestions:
  • Don't use a regular grid. Look into something like Gaussian quadrature.
  • Is the function symmetric? If so, find the center and integrate half of the domain, and then double the result[/color].
  • That you said "-10:0.01:10" suggests you are doing this in Matlab. Matlab is 10-100 times slower than C or Fortran.
 
Thanks for the replies. I'll look into Gaussian quadrature.

I feel silly not having thought of the symmetry of the curve, since I know exactly where the centre is already. Unfortunately I don't have access to C or Fortran, and my code needs to integrate with a lot of other code I have already written in MATLAB.

I didn't realize it was so slow though? How can it be so slow?
 
You most certainly do have access to C. C/C++ comes bundled with the system if you are working on a Linux machine or a Mac. If you are working on a Windows machine, there are plenty of free C/C++ compilers available, some directly from Microsoft.

Matlab is a nice tool for developing an initial solution to some problem. It's graphics are phenomenal. It has huge libraries of tools and techniques. However, it is slow. It is an interpreted language.

Since you are using Matlab, learn to use the huge set of tools and techniques that are an integral part of Matlab. Look into Matlab's numerical quadrature routines. Matlab supplies a Gaussian quadrature function, and it is rather smart (adaptive). You do not need to reinvent the wheel here; besides, your wheel won't look as nice as Matlab's wheel. All you need to supply is the function and the integration interval to Matlab's Gaussian quadrature function -- and this can be an infinite interval with that function.
 

Similar threads

  • · Replies 10 ·
Replies
10
Views
3K
Replies
27
Views
4K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 9 ·
Replies
9
Views
4K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 4 ·
Replies
4
Views
1K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 4 ·
Replies
4
Views
7K