Professional Documents
Culture Documents
Numerical Integration
x n 1
Steven Kornreich
www.beachlook.com
Integration procedure:
We will need to define an operator
which will
take as input
a function
limits of integration
2
From Calculus:
x n 1
Rectangular rule:
Evaluate the function at
the left endpoint of each
interval.
Multiply by the width of
the interval.
Equivalent to sum of
rectangular areas. 3
Alternate: Midpoint rule
x n 1
Midpoint rule.
Evaluate the function at the left
endpoint of each interval.
Multiply by the width of the interval.
Equivalent to sum of rectangular
areas, but has a better discrete error
behavior.
4
A first Implementation: Procedural
int main() {
#include <iostream>
double loLimit, upLimit;
#include <cmath>
int nIntervals;
using namespace std; cout << "Enter lower limit and upper
limit" << endl;
double square(double aX) { cin >> loLimit >> upLimit;
return aX*aX; cout << "Enter number of intervals"
} << endl;
cin >> nIntervals;
double integrate(double aLeftLimit, double aRightLimit, cout << "Integral of x^2 from 0 to 1
int aNumberOfIntervals, double integrand(double)) { ="
<<
double dx = (aRightLimit - aLeftLimit)/aNumberOfIntervals; integrate(loLimit,upLimit,nIntervals,
double x = aLeftLimit; square) << endl;
double sum = 0;
for (int i=0; i<aNumberOfIntervals; ++i) {
return 0;
sum+= integrand(x+dx); // eval function at right endpoint, increase
sum }
x+=dx; // increase lower limit
}
return sum*dx;
}
5
Implementing code with a desired
accuracy.
int main() {
double loLimit, upLimit, epsilon, result;
int nIntervals;
cout << "Enter lower limit and upper limit" << endl;
cin >> loLimit >> upLimit;
cout << "Enter initial number of intervals, and maximum allowed error" << endl;
cin >> nIntervals >> epsilon;
class IntegralCalculator {
public:
IntegralCalculator(double aIntegrandFunction(double));
void setNumberOfIntervals(int aNumberOfIntervals)
{mNumberOfIntervals=aNumberOfIntervals;}
void setLeftLimit(int val) {mLeftLimit=val;}
void setRightLimit(int val) {mRightLimit=val;}
void readInputData();
void integrate();
void print();
private:
int mNumberOfIntervals;
double mLeftLimit;
double mRightLimit;
double mResult;
double (*mIntegrandFunction) (double);
};
7
#endif
The source file: IntegralCalculator.cc
#include "IntegralCalculator.hh"
void IntegralCalculator::integrate() {
#include <iostream>
double dx = (mRightLimit -
#include <cmath> mLeftLimit)/mNumberOfIntervals;
double x = mLeftLimit;
using namespace std; double sum = 0;
for (int i=0; i<mNumberOfIntervals; ++i) {
IntegralCalculator::IntegralCalculator(double sum+= mIntegrandFunction(x+dx);
aIntegrandFunction(double)) {
x+=dx; // increase lower limit
mIntegrandFunction = aIntegrandFunction;
}
}
mResult = sum*dx;
void IntegralCalculator::readInputData() {
double loLimit, upLimit;
}
int nIntervals;
cout << "Enter lower limit and upper limit" << endl;
void IntegralCalculator::print() {
cin >> loLimit >> upLimit;
cout << "Integral of your function from "
cout << "Enter number of intervals" << endl;
<< mLeftLimit << " to " << mRightLimit
cin >> nIntervals;
<< " = " << mResult << endl;
setLeftLimit(loLimit);
}
setRightLimit(upLimit);
setNumberOfIntervals(nIntervals);
return;
}
8
The new main() using the class.
#include "IntegralCalculator.hh"
return aX*aX;
}
int main() {
IntegralCalculator IC1(square);
IC1.readInputData();
IC1.integrate();
IC1.print();
return 0;
}
9
Compiling and linking with a class
Compiling the class to create a
machine readable object file:
g++ IntegralCalculator.cc –c
Compiling the file containing the main
function and linking with the
previously created object file:
g++ integWithClass.cc –o integWithClass
IntegralCalculator.o
10
For Homework: Numerical Integration
Chapter 13, Section 13.4