purpleblau
purpleblau

Reputation: 589

Function to differentiate a polynomial in C++

I've been trying to get this solved but without luck. All I want to do is to differentiate a polynomial like P(x) = 3x^3 + 2x^2 + 4x + 5 At the end of the code, the program should evaluate this function and gives me just the answer.

The derivative of P(x) is P'(x) = 3*3x^2 + 2*2x + 4*1. If x = 1, the answer is 17. I just don't get that answer no matter how I alter my loop.

    /*
    x: value of x in the polynomial
    c: array of coefficients
    n: number of coefficients
    */
        double derivePolynomial(double x, double c[], int n) {
                double result = 0;  
                double p = 1;
                int counter = 1;

                for(int i=n-1; i>=0; i--) //backward loop
                    {
                    result = result + c[i]*p*counter;
                    counter++; // number of power
                    p = p*x;
                }

                return result;
            }



   //Output in main() looks like this

   double x=1.5;
   double coeffs[4]={3,2.2,-1,0.5};
   int numCoeffs=4;

   cout << " = " << derivePolynomial(x,coeffs,numCoeffs) << endl;

Upvotes: 2

Views: 20472

Answers (2)

user529758
user529758

Reputation:

The derivative of x ^ n is n * x ^ (n - 1), but you are calculating something completely different.

double der(double x, double c[], int n)
{
    double d = 0;
    for (int i = 0; i < n; i++)
        d += pow(x, i) * c[i];
    return d;
}

This would work, assuming that your polinomial is in the form c0 + c1x + c2x ^ 2 + ...

Demonstration, with another function that does the derivation as well.

Edit: alternative solution avoiding the use of the pow() function, with simple summation and repeated multiplication:

double der2(double x, double c[], int n)
{
    double d = 0;
    for (int i = 0; i < n - 1; i++) {
        d *= x;
        d += (n - i - 1) * c[i];
    }
    return d;
}

This works too. Note that the functions that take the iterative approach (those which don't use pow()) expect their arguments (the coefficients) in reverse order.

Upvotes: 6

tomato
tomato

Reputation: 749

You need to reverse the direction of the loop. Start at 0 and go to n.

At the moment when you compute the partial sum for the n-th power p is 1. For the last one x^0 you your p will contain x^n-1 th power.

    double derivePolynomial(double x, double c[], int n) {
            double result = 0;  
            double p = 1;
            int counter = 1;

            for(int i=1; i<n; i++) //start with 1 because the first element is constant.
                {
                result = result + c[i]*p*counter;
                counter++; // number of power
                p = p*x;
            }

            return result;
        }

double x=1; double coeffs[4]={5,4,2,3}; int numCoeffs=4;

cout << " = " << derivePolynomial(x,coeffs,numCoeffs) << endl;

Upvotes: 1

Related Questions