Posted on 2011/10/11 17:23 / Filed Under Coding/C,C++
글 주소 : http://blog.sam-chon.com/blog/14

조건 )
1. 직선 1 : 임의의 두 점을 잇는 직선
2. 직선 2 : 함수형태로 주어진 직선

#include <stdio.h>

double f(double x)
{
  return 0.5 * x + 2.0;
}

double abs(double x)
{
  if(x < 0.0) return -1.0* x;
  return x;
}

typedef struct
{
  double x;
  double y;
} point;

void main()
{
  point p1,p2;
  point p_div;
  double gap_1,gap_2,gap_3;
  int counter = 0;
  double tole = 0.0001;
  p1.x = 8.0;
  p1.y = 72.0;
  p2.x = 1.0;
  p2.y = 2.0;
  printf("\n[initial value] p1.x = %.6lf, p2.x = %.6lf\n",p1.x,p2.x);
 
 while(1)
 {
  counter++;
  p_div.x = (p1.x + p2.x) / 2.0;
  p_div.y = (p1.y + p2.y) / 2.0;
  if( abs(f(p1.x) - f(p2.x) ) < tole )
  {
   printf("값 찾음.\n");
   break;
  }
  gap_1 = p1.y - f(p1.x);
  gap_2 = p_div.y - f(p_div.x);
  gap_3 = p2.y - f(p2.x);   if(gap_1 * gap_2 < 0.0)
  {
   p2.x = p_div.x;
   p2.y = p_div.y;
  }
  else if(gap_2 * gap_3 < 0.0)
  {
   p1.x = p_div.x;
   p1.y = p_div.y;
  }
  else 
  {
   printf("두 점을 잇는 직선과 주어진 직선이 교차하지 않는다.\n");
   break;
  }   printf("\np1.x = %.6lf, p2.x = %.6lf\n",p1.x,p2.x);  
 if(counter > 100)
  {
   printf("100회 안에 못 찾음.\n");
   break;
  }
 }
 printf("[결과] 교점 x = %.6lf, y = %.6lf\n",
  (p1.x + p2.x) / 2.0,(p1.y + p2.y) / 2.0);
return;
}


bisection method를 이용해 100회 시도하며 오차가 0.0001 안쪽으로 들어오면 값을 찾은 것으로 간주한다.


2011/10/11 17:23 2011/10/11 17:23

트랙백 주소 : http://blog.sam-chon.com/blog/trackback/14

댓글을 달아 주세요

About

by 삼촌

Notice

Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.