Search code examples
javamathderivativenewtons-method

How-to apply Newton-Raphson method to find roots of a quintic function


Description

I have developed an algorithm implementing Newton-Raphson method to find a root of a quintic function. The result which I must mirror is 303.6. However, my implementation fails to measure up.

Data

Parameters

g = 9.81; 
Ds = 0.198; 
uj = 805.9; 
W = 0.0557;

Equation

0.024*((gDs/uj^2)^(1/3))(Y^(5/3)) + 0.2*(Y^(2/3)) - ((2.85/W)^(2/3)) = 0

Where derivative for Y:

(0.04*d^(1/3)⋅g(1/3)⋅y^(2/3)) / u(2/3) + 2/15*y^(1/3)

Solving root for Y

Code

    import java.lang.*;
    public class InvokeNewton {
    public static void main(String argv[]) {
    double del = 1e-5,
    double xx = 0 ;
    double dx =0, 
    double x= Math.PI/2;
    int k = 0;
    while (Math.abs(xx-x) > del && k<10 && f(x)!=0) {
      dx = f(x)/d(x);
      xx=x;
      x =x - dx;
      k++;

    System.out.println("Iteration number: " + k);
    System.out.println("Root obtained: " + x);
    System.out.println("Estimated error: " + Math.abs(xx-x));
    }
  }

    // Method to provide function f(x)

      public static double f(double x) {
        return 0.024*(Math.pow(g * Ds / Math.pow(uj, 2.0),(1.0/3.0)) *                       (Math.pow(Y,5.0/3.0))+ 0.2*(Math.pow(Y,2.0/3.0)) - (Math.pow((2.85/W)(2.0/3.0))));
      }

    // Method to provide the derivative f'(x).

      public static double d(double x) {
        return (0.04*Math.pow(Ds,1.0/3.0)*Math.pow(Y,2.0/3.0)) / Math.pow*uj,2.0/3.0) + 2 /    15*Math.pow(Y,1.0/3.0);
      }

}

Output

    Iteration number: 1
Root obtained: 3.65373153496716
Estimated error: 2.0829352081722634
Iteration number: 2
Root obtained: 5.2246000232674215
Estimated error: 1.5708684883002615
Iteration number: 3
Root obtained: 6.618389759316356
Estimated error: 1.3937897360489346
Iteration number: 4
Root obtained: 7.906164279270034
Estimated error: 1.287774519953678
Iteration number: 5
Root obtained: 9.119558352547333
Estimated error: 1.213394073277299
Iteration number: 6
Root obtained: 10.27633029334909
Estimated error: 1.1567719408017574
Iteration number: 7
Root obtained: 11.387769167896339
Estimated error: 1.1114388745472485
Iteration number: 8
Root obtained: 12.461641418739712
Estimated error: 1.0738722508433725
Iteration number: 9
Root obtained: 13.503592201954325
Estimated error: 1.041950783214613
Iteration number: 10
Root obtained: 14.517895007865569
Estimated error: 1.0143028059112442

The equation and the derivative has been checked and double-checked, however I am still not getting the desired output

Reference

Newton Method


Solution

  • The code has been modified accordingly. The code provides comments to simplify modification to your specific case.

        public class RootFinder {
    
        // Method to be called to calculate the root 
    
        public void InvokeNewton(){
            double del = 1e-10;                                  // Delta or precision; 
            double xx = 0 ;                                      // Storage for previous root
    
            double dx = 0;                                       // Storage to hold a derivative of a pre-defined function;
            double x= Math.sqrt(beta/alpha);                     // Initial guess;
    
            while (Math.abs(xx-x) >= del &&  f(x)!= 0.0) {       // Math.abs(xx-x) - Estimated error;
                dx = f(x)/d(x);                                  // Derivative
                xx=x;                                            // New xx value set to previous root for compersion;
                x = x - dx;                                      // Root obtained;
            }
        }// Method to provide function f(x)
                              // !!! Provide your function bellow !!!
        public double f(double x) {
            return (alpha * (Math.pow(x,5.0/3.0)) + 0.2*(Math.pow(x,2.0/3.0)) - beta);
        }
    
        // Method to provide the derivative f'(x).
                              // !!!Provide the prime derivative of your function bellow!!!
        public double d(double x) {
            return (0.04*Math.pow(jf.getSourceDiameter(),1.0/3.0)*Math.pow(x,2.0/3.0)) / Math.pow(jf.getJetVelocity(),2.0/3.0) + 2.0 /  15.0*Math.pow(x,1.0/3.0);
        }
    }