در این آموزش، با روش عددی یافتن ریشه معادله آشنا می‌شویم. می‌خواهیم معادله‌ای به فرم $$ f ( x ) = 0 $$ را حل کنیم. بدین منظور از روش سکانت یا وتری (Secant Method) استفاده می‌کنیم. در ادامه، روش سکانت به طور خلاصه توضیح داده شده است.

یافتن ریشه معادله

همان‌طور که گفتیم، از روش سکانت یا وتری استفاده می‌کنیم. با داشتن مقادیر اولیه $$ x _ 0 $$ و $$ x _ 1 $$، معادله خط گذرنده از نقاط $$ ( x _ 1 , f ( x _ 1 ))$$ و $$ ( x _ 2 , f ( x _ 2 )) $$ را به صورت زیر می‌نویسیم:

$$ \large y = \frac { f ( x _ 2 ) – f ( x _ 1 ) } { x _ 2 – x _ 1 } ( x – x _ 2 ) + f ( x _ 2 ) . $$

ریشه این تابع خطی، مقداری از $$ x $$ است که به ازای آن، $$ y = 0 $$ است:

$$ \large x = x _ 2 – f ( x _ 2 ) \frac { x _ 2 – x _ 1 } { f ( x _ 2 ) – f ( x _ 1 ) } . $$

در ادامه، از مقدار جدید $$ x $$ به عنوان $$ x _ 3 $$ استفاده کرده و روال را به جای $$ x _ 1 $$ و $$ x _2$$، با $$ x _ 2 $$ و $$ x _ 3 $$ تکرار می‌کنیم. این کار را تا جایی ادامه می‌دهیم که به دقت مناسبی برسیم و اختلاف بین $$ x _{n-1}$$ و $$ x _ n $$ به مقدار بسیار کوچکی میل کند:

$$ \large \begin {align}
x _ 3 & = x _ 2 – f ( x _ 2 ) \frac { x _ 2 – x _ 1 } { f ( x _ 2 ) – f ( x _ 1 ) } , \\[6pt] x _ 4 & = x _ 3 – f ( x _ 3 ) \frac { x _ 3 – x _ 2 } { f ( x _ 3 ) – f ( x _ 2 ) } , \\[6pt] & \, \, \, \vdots \\[6pt] x _ n & = x _ { n – 1 } – f ( x _ { n – 1 } ) \frac { x _ { n – 1 } – x _ { n – 2 } } { f ( x _ { n – 1 } ) – f ( x _ { n – 2 } ) } .
\end {align} $$

به طور خلاصه می‌توان گفت که روش سکانت با رابطه بازگشتی زیر تعریف می‌شود:

$$ \large \begin {align*} x _ n & = x _ { n – 1 } – f ( x _ { n – 1 } ) \frac { x _ { n – 1 } – x _ { n – 2 } } { f ( x _ { n – 1 } ) – f ( x _ { n – 2 } ) }
\\ & = \frac { x _ { n – 2 } f ( x _ { n – 1 } ) – x _ { n – 1 } f ( x _ { n – 2 } ) } { f ( x _ { n – 1 } ) – f ( x _ { n – 2 } ) } . \end {align*} $$

همان‌طور که از این رابطه بازگشتی می‌بینیم، روش سکانت به دو مقدار اولیه $$ x _ 1 $$ و $$ x _ 2 $$ نیاز دارد و این مقادیر باید به گونه‌ای انتخاب شوند که نزدیک ریشه باشند.

پیاده‌سازی یافتن ریشه معادله در زبان‌های برنامه‌نویسی مختلف

در ادامه،‌ برنامه یافتن ریشه معادله در زبان‌های برنامه‌نویسی مختلف ارائه شده است.

مثالی از ورودی و خروجی برنامه‌های زیر به این صورت است:
Input : equation = x3 + x - 1 
        x1 = 0, x2 = 1, E = 0.0001
Output : Root of the given equation = 0.682326
         No. of iteration=5

برنامه یافتن ریشه معادله در ++C

// C++ Program to find root of an 
// equations using secant method 
#include <bits/stdc++.h> 
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.

برنامه یافتن ریشه معادله در Python

# Python3 program to find the values of 
# X and Y using the given equations 

# Function to find the values of X and Y 
def findValues(a, b): 

	# base condition 
	if ((a - b) % 2 == 1): 
		print("-1"); 
		return; 

	# required answer 
	print((a - b) // 2, (a + b) // 2); 

# Driver Code 
a = 12; b = 8; 

findValues(a, b); 

# This code is contributed 
# by Akanksha Rai

برنامه یافتن ریشه معادله در #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

<?php 
// PHP Program to find root of an 
// equations using secant method 

// function takes value of x 
// and returns f(x) 
function f( $x) 
{ 
	
	// we are taking equation 
	// as x^3+x-1 
	$f = pow($x, 3) + $x - 1; 
	return $f; 
} 

function secant($x1, $x2, $E) 
{ 
	$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 (abs($xm - $x0) >= $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. 
?>

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

سید سراج حمیدی دانش‌آموخته مهندسی برق است و به ریاضیات و زبان و ادبیات فارسی علاقه دارد. او آموزش‌های مهندسی برق، ریاضیات و ادبیات مجله فرادرس را می‌نویسد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *