📜  程序使用割线法找到方程式的根

📅  最后修改于: 2021-05-04 18:18:58             🧑  作者: Mango

割线方法用于找到方程f(x)= 0的根。它是从两个不同的根估计x1和x2开始的。这是一个涉及对根进行线性插值的迭代过程。如果两个中间值之间的差小于收敛因子,则迭代停止。

例子 :

Input : equation = x3 + x - 1 
        x1 = 0, x2 = 1, E = 0.0001
Output : Root of the given equation = 0.682326
         No. of iteration=5

算法

Initialize: x1, x2, E, n         // E = convergence indicator
calculate f(x1),f(x2)

if(f(x1) * f(x2) = E); //repeat the loop until the convergence
    print 'x0' //value of the root
    print 'n' //number of iteration
}
else
    print "can not found a root in the given interval"
C++
// C++ Program to find root of an 
// equations using secant method
#include 
using namespace std;
// function takes value of x and returns f(x)
float f(float x)
{
    // we are taking equation as x^3+x-1
    float f = pow(x, 3) + x - 1;
    return f;
}
  
void secant(float x1, float x2, float E)
{
    float n = 0, xm, x0, c;
    if (f(x1) * f(x2) < 0) {
        do {
            // calculate the intermediate value
            x0 = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
  
            // check if x0 is root of equation or not
            c = f(x1) * f(x0);
  
            // update the value of interval
            x1 = x2;
            x2 = x0;
  
            // update number of iteration
            n++;
  
            // if x0 is the root of equation then break the loop
            if (c == 0)
                break;
            xm = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
        } while (fabs(xm - x0) >= E); // repeat the loop
                                // until the convergence
  
        cout << "Root of the given equation=" << x0 << endl;
        cout << "No. of iterations = " << n << endl;
    } else
        cout << "Can not find a root in the given inteval";
}
  
// Driver code
int main()
{
    // initializing the values
    float x1 = 0, x2 = 1, E = 0.0001;
    secant(x1, x2, E);
    return 0;
}


Java
// Java Program to find root of an 
// equations using secant method
class GFG {
      
    // function takes value of x and 
    // returns f(x)
    static float f(float x) {
          
        // we are taking equation 
        // as x^3+x-1
        float f = (float)Math.pow(x, 3) 
                               + x - 1;
                                 
        return f;
    }
      
    static void secant(float x1, float x2,
                                float E) {
          
        float n = 0, xm, x0, c;
        if (f(x1) * f(x2) < 0) 
        {
            do {
                  
                // calculate the intermediate
                // value
                x0 = (x1 * f(x2) - x2 * f(x1))
                            / (f(x2) - f(x1));
          
                // check if x0 is root of
                // equation or not
                c = f(x1) * f(x0);
          
                // update the value of interval
                x1 = x2;
                x2 = x0;
          
                // update number of iteration
                n++;
          
                // if x0 is the root of equation 
                // then break the loop
                if (c == 0)
                    break;
                xm = (x1 * f(x2) - x2 * f(x1)) 
                            / (f(x2) - f(x1));
                              
                // repeat the loop until the 
                // convergence 
            } while (Math.abs(xm - x0) >= E); 
                                                  
            System.out.println("Root of the" +
                    " given equation=" + x0);
                      
            System.out.println("No. of "
                      + "iterations = " + n);
        } 
          
        else
            System.out.print("Can not find a"
              + " root in the given inteval");
    }
      
    // Driver code
    public static void main(String[] args) {
          
        // initializing the values
        float x1 = 0, x2 = 1, E = 0.0001f;
        secant(x1, x2, E);
    }
}
  
// This code is contributed by Anant Agarwal.


Python3
# Python3 Program to find root of an 
# equations using secant method 
  
# function takes value of x 
# and returns f(x) 
def f(x):
      
    # we are taking equation 
    # as x^3+x-1 
    f = pow(x, 3) + x - 1; 
    return f; 
  
def secant(x1, x2, E):
    n = 0; xm = 0; x0 = 0; c = 0; 
    if (f(x1) * f(x2) < 0):
        while True: 
              
            # calculate the intermediate value 
            x0 = ((x1 * f(x2) - x2 * f(x1)) / 
                            (f(x2) - f(x1))); 
  
            # check if x0 is root of 
            # equation or not 
            c = f(x1) * f(x0); 
  
            # update the value of interval 
            x1 = x2; 
            x2 = x0; 
  
            # update number of iteration 
            n += 1; 
  
            # if x0 is the root of equation 
            # then break the loop 
            if (c == 0): 
                break; 
            xm = ((x1 * f(x2) - x2 * f(x1)) / 
                            (f(x2) - f(x1)));
              
            if(abs(xm - x0) < E):
                break;
          
        print("Root of the given equation =", 
                               round(x0, 6)); 
        print("No. of iterations = ", n); 
          
    else:
        print("Can not find a root in ",
                   "the given inteval"); 
  
# Driver code 
  
# initializing the values 
x1 = 0; 
x2 = 1; 
E = 0.0001; 
secant(x1, x2, E); 
  
# This code is contributed by mits


C#
// C# Program to find root of an 
// equations using secant method
using System;
  
class GFG {
      
    // function takes value of 
    // x and returns f(x)
    static float f(float x) 
    {
          
        // we are taking equation 
        // as x^3+x-1
        float f = (float)Math.Pow(x, 3) 
                                + x - 1;
        return f;
    }
      
    static void secant(float x1, float x2,
                    float E)                 
                      
    {
          
        float n = 0, xm, x0, c;
        if (f(x1) * f(x2) < 0) 
        {
            do {
                  
                // calculate the intermediate
                // value
                x0 = (x1 * f(x2) - x2 * f(x1))
                    / (f(x2) - f(x1));
          
                // check if x0 is root of
                // equation or not
                c = f(x1) * f(x0);
          
                // update the value of interval
                x1 = x2;
                x2 = x0;
          
                // update number of iteration
                n++;
          
                // if x0 is the root of equation 
                // then break the loop
                if (c == 0)
                    break;
                xm = (x1 * f(x2) - x2 * f(x1)) 
                    / (f(x2) - f(x1));
                              
                // repeat the loop until 
                // the convergence 
            } while (Math.Abs(xm - x0) >= E); 
                                                  
            Console.WriteLine("Root of the" +
                    " given equation=" + x0);
                      
            Console.WriteLine("No. of " + 
                              "iterations = " + n);
        } 
          
        else
            Console.WriteLine("Can not find a" + 
                              " root in the given inteval");
    }
      
    // Driver code
    public static void Main(String []args) 
    {
          
        // initializing the values
        float x1 = 0, x2 = 1, E = 0.0001f;
        secant(x1, x2, E);
    }
}
  
// This code is contributed by vt_m.


PHP
= $E); 
          
        echo "Root of the given equation=". $x0."\n" ;
        echo "No. of iterations = ". $n ;
          
    } else
        echo "Can not find a root in the given inteval";
}
  
// Driver code
{
      
    // initializing the values
    $x1 = 0; $x2 = 1; 
    $E = 0.0001;
    secant($x1, $x2, $E);
    return 0;
}
  
// This code is contributed by nitin mittal.
?>


输出 :

Root of the given equation = 0.682326
No. of iterations = 5

时间复杂度= O(1)

参考
https://en.wikipedia.org/wiki/Secant_method