'전산물리'에 해당되는 글 1건

  1. 2010.04.11 bisection method 6
물리2010. 4. 11. 00:28
남들과는 조금 다르게 재귀적 용법을 사용해서 만들어 봤습니다. 
재귀적 용법이 어떤때는 좀더 덜 직관적일때도 있고 어떤때는 메모리 문제로 많은이들이 회피 하지만.. 간단하게 짤수 있고 소스코드가 짧아진다는 장점은 여전히 있습니다.. 머.. 그렇게 생각 안하시는 분들이 많을거 같네요..^^ㅋ

bisection method는 풀수 없는 어떤 방정식이 있을때 그 것을 대수적(numerical)하게 푸는 유용한 방법중에 하나로  상당히 직관적이면서 편리 합니다. 클릭해보시면 알겠지만 위키에 아주 설명이 잘 되있습니다. 

 

예를 들어 아래 와 같이 


a+\sin(x)+bx=0


과 같으 수식이 있다고 하면 손으로 푸는것은 쉽지 않습니다. 이 경우엔 어떤 지점 a,b를 잡아서 f(a)와 f(b)의 곱을 구합니다. 그후에 그들의 값이 0보다 작은우 해는 a와 b사이에 있는 어떤 값이 되겠죠. 여기서 a와 b를 점점 줄여가면서 해로 근접해 가는 방법 입니다. 별로 어렵지 않죠?


그림이 있어야 이해가기가 쉬운데.. 아쉽게도 그림으로 그리기는 쉽지가 않네요.
이 글이 많은 사람들에게 도움이 되기를 기도해봅니다.. ^^ 

 

 

 


double bisection(double time, double velocity)
{
        double solution1;
        double solution2;

        solution1=0;
        solution2=1000;
        return moving_mid(solution1, solution2, time, velocity);
}

double eq(double sol, double time, double velocity)
{
        return 4+sin(time)+sin(sol)-velocity*sol;
}

double moving_mid(double solution1, double solution2, double time, double velocity)
{
        double solu_mid;

        velocity=fabs(velocity);
        if( fabs(solution1 - solution2) < 0.00001)
                return solution1;
        else if(eq(solution1, time, velocity)*eq(solution2, time, velocity) < 0 )
        {
                solu_mid= (solution1 + solution2)/2; 
                solution1 = solu_mid;
                return moving_mid(solution2, solution1, time, velocity);
        }
        else
        {
                solution1=solution1*2 - solution2; 
                return moving_mid(solution2, solution1, time, velocity);
        }
 
}

이 글은 스프링노트에서 작성되었습니다.

Posted by blindfish