Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

비선형 방정식을 푸는 시컨트 방법


시컨트 방법은 비선형 방정식을 풀 때도 사용됩니다. 이 방법은 Newton-Raphson 방법과 유사하지만 여기서는 f(x) 함수의 미분을 찾을 필요가 없습니다. f(x) 만 사용하면 Newton의 Divide 차이 공식을 사용하여 수치적으로 f'(x)를 찾을 수 있습니다. Newton-Raphson 공식에서

우리는 알고 있습니다.

비선형 방정식을 푸는 시컨트 방법

이제 나누기 차분 공식을 사용하여 다음을 얻습니다.

비선형 방정식을 푸는 시컨트 방법 비선형 방정식을 푸는 시컨트 방법 비선형 방정식을 푸는 시컨트 방법

Newton-Raphson 공식의 f'(x)를 새로운 f'(x)로 바꾸면 비선형 방정식을 풀기 위한 시컨트 공식을 찾을 수 있습니다.

비선형 방정식을 푸는 시컨트 방법

참고: 이 방법의 경우 비선형 방정식의 근을 찾기 시작하려면 두 개의 초기 추측값이 필요합니다.

입력 및 출력

Input:
The function f(x) = (x*x) - (4*x) - 10
Output:
The root is: -1.74166

알고리즘

secant(x1, x2)

입력: 루트에 대한 두 개의 초기 추측.

출력: 비선형 방정식 f(x)의 근사근입니다.

Begin
   f1 := f(x1)
   f2 := f(x2)
   x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
   while relative error of x3 and x2 are > precision, do
      x1 := x2
      f1 := f2
      x2 := x3
      f2 := f(x2)
      x3 := ((f2*x1) – (f1*x2)) / (f2 – f1)
   done
   root := x3
   return root
End

예시

#include<iostream>
#include<cmath>
using namespace std;

double absolute(double value) {             //to find magnitude of value
   if(value < 0)
      return (-value);
   return value;
}

double f(double x) {              //the given function x^2-4x-10
   return ((x*x)-(4*x)-10);
}

double secant(double x1, double x2) {
   double x3, root;
   double f1, f2;
   f1 = f(x1);
   f2 = f(x2);
   x3 = (f2*x1-f1*x2)/(f2-f1);

   while(absolute((x3-x2)/x3) > 0.00001) {         //test accuracy of x3
      x1 = x2;           //shift x values
      f1 = f2;
      x2 = x3;
      f2 = f(x2);                 //find new x2
      x3 = (f2*x1-f1*x2)/(f2-f1);          //calculate x3
   }

   root = x3;
   return root;              //root of the equation
}

main() {
   double a, b, res;
   a = 0.5;
   b = 0.75;
   res = secant(a, b);
   cout << "The root is: " << res;
}

출력

The root is: -1.74166