Search code examples
c++algorithmintegralpolynomials

C++: How to compute an integral with interval bounds?


I am both tired, new to C++ and real bad at dealing with polynomials. That's a bad combo for my assignment. Nevertheless I am trying to solve it. Please note that I might have misunderstood certain parts both mathematically and language-wise. Maybe even terminology.

The first task of my assignment was to create a class for storing polynomials. I figured the important parts were coefficiants and the degree of the polynomial. As such I have a polynomial class that (partly) looks like this:

class Polynomial {

private:
    double* Coefficients;  //Array of coefficients in order of ascending power
    int Degree; //The degree of the polynomial

...

The class should have a method for finding the integral of the polynomial within a lower and upper bound. But I really do not know how to work with it.

Since it's bad practise not to show what I've done, this is what I currently have, and it probably does not make a lot of sense, but please, if you can, point me in the right direction?

Polynomial Polynomial::ComputeIntegral(double lower, double upper) {
    //Values needed to create new polynomial
    //degree will be one more than the original polynomial
    int degree = Degree + 1;
    double* coefficients = new double[degree + 1];

    coefficients[0] = 0;

    for (int i = 0; i < degree +1; i++) {
        coefficients[i + 1] = Coefficients[i] / (double)(i + 1);
    }

    Polynomial integral(degree, coefficients);
    return integral;
}

That I can see myself, it is messed up because a) I do not use the bounds, and b) I am pretty sure per the assignment description I should end up with a value rather than a new polynomial.

Google tells me there are algorithms to deal with finding integrals (Trapezoid for example), but I can not wrap my head around matching that with my representation of a polynomial.


Solution

  • A few pointers:

    1. Use std::vectors instead of pointers and new. (If you are new to C++, there are very few circumstances when you actually need to use new.)
    2. ComputeIntegral(double, double) will need to return a double, since it is obviously computing a definite integral. (The function you have at the moment would be something like GetPrimitive(), as it returns the primitive of the polynomial, which is another poly.
    3. The definite integral is the difference of the primitive evaluated at the bounds (First Fundamental theorem of calculus).
    4. There are a number of ways you could represent the polynomial as a data structure, but I would suggest a single std::vector<double> coeffs that represents all of the coefficients up to the degree of the poly, then the degree can be calculated at coeffs.size(). In some cases there may be zeroes in that coeffs though.