割线方法用于找到方程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