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

이분법을 위한 C++ 프로그램

<시간/>

f(x)에 숫자 a와 b가 있는 경우 f(a) * f(b)> 0이고 함수 f(x)는 a와 b 사이에 있어야 합니다. 즉, f(x) =[a, b ]. 작업은 이분법을 사용하여 함수 f(x)에서 간격 a와 b 사이에 있는 루트 값을 찾는 것입니다.

이분법이란 무엇입니까?

이분법은 'a'와 'b'로 정의된 주어진 한계 내에서 함수 f(x)에서 근의 값을 찾는 데 사용됩니다. 함수의 근은 f(a) =0이 되도록 값 a로 정의할 수 있습니다.

예시

Quadratic equation F(x) =  - 8
This equation is equals to 0 when the value of x will be 2 i.e.  - 8 = 0
So, root of this quadratic function F(x) will be 2.

이제 함수 f(x)가 주어진 간격 [a..b]에서 연속이고 f(a)의 부호 ≠ f(b)의 부호인 경우 간격 a에 속하는 값 m이 있습니다. f(m) =0

이 되도록 b

값 m [a..b] f(m) =0

즉. m은 배수가 될 수 있는 루트의 값입니다.

다음은 f(a) 및 f(b) 간격을 나타내는 그림입니다. 이 간격 사이의 근을 찾기 위해 한계를 부분으로 나누고 변수 m 즉

에 저장합니다.

m =(a + b) / 2

이분법을 위한 C++ 프로그램

한계를 나눈 후 아래 그림과 같이 새 간격이 생성됩니다.

이분법을 위한 C++ 프로그램

예시

Input-: x^3 - x^2 + 2 ; a =-500 and b = 100
Output-: The value of root is : -0.991821
Input-: x^3 - x^2 + 2 ; a =-200 and b = 300
Output-: The value of root is : -1.0025

우리가 아래 프로그램에서 사용하는 접근 방식은 다음과 같습니다 -

  • 방정식과 구간 및 b의 값 입력
  • 간격을 다음과 같이 나눕니다. m =(a + b) / 2
    • 프린트 m은 루트입니다.
  • 만약 f(m) ≠ 0
    • f(a) * f(m) <0인지 확인
    • 그런 다음 루트는 와 m 사이에 놓입니다.
    • f(b) * f(m) <0인지 확인
    • 그런 다음 루트는 b와 m 사이에 놓입니다.

알고리즘

Start
Step 1-> In function double solution(double x)
   Return x*x*x - x*x + 2
Step 2-> In function bisection(double a, double b)
   If solution(a) * solution(b) >= 0 then,
      Print "You have not assumed right a and b "
      Return
   End If
   Set c = a
   Loop While (b-a) >= EP
      Set c = (a+b)/2
      If solution(c) == 0.0
         Break
      End If
      Else if solution(c)*solution(a) < 0
         Set b = c
      End Else If
      Else
         Set a = c
      End Else
   End
   Print "The value of root”
Step 3-> In function int main()
   Declare and Initialize inputs  a =-500, b = 100
   Call function bisection(a, b)
Stop

예시

#include <iostream>
using namespace std;
#define EP 0.01
// An example function whose solution is determined using
// Bisection Method. The function is x^3 - x^2 + 2
double solution(double x) {
   return x*x*x - x*x + 2;
}
// Prints root of solution(x) with error in EPSILON
void bisection(double a, double b) {
   if (solution(a) * solution(b) >= 0) {
      cout << "You have not assumed right a and b\n";
      return;
   }
   double c = a;
   while ((b-a) >= EP) {
      // Find middle point
      c = (a+b)/2;
      // Check if middle point is root
      if (solution(c) == 0.0)
         break;
       // Decide the side to repeat the steps
      else if (solution(c)*solution(a) < 0)
         b = c;
      else
         a = c;
   }
   cout << "The value of root is : " << c;
}
 // main function
int main() {
   double a =-500, b = 100;
   bisection(a, b);
   return 0;
}

출력

The value of root is : -0.991821