본문 바로가기
학부 강의 노트/포트란 프로그래밍 (보충예제)

포트란 기본 예제7 (순환구조 DO loop)

by Dr. STEAM 2022. 6. 9.
반응형

순환구조의 종류

1. DO (횟수 제어 순환구조)

    (구조명 : ) do [var = 초기값, 끝값, (증분)]

                          실행문

                      end do

do 이후 [ ] 내용이 없는 구조도 가능

 

2. DO WHILE (조건적 순환구조)

    (구조명 : )  do while (조건)

                           실행문

                      end do 

 

 

 

(예제)

f(x) = x^3 + 4x^2 - 10 = 0 근을 bisection method (이분법) 로 계산하는 프로그램
이분법 계산과정


1) 입력한 양 끝단점  a,b의 함수 f(a), f(b)의 부호가 같으면 a,b 사이에 근이 없다. 
2) f(a), f(b)의 부호가 다르면 a, b, 사이에 근이 존재
3) 근이 있는 경우, 중앙점 p를 계산하고 함수 f(p)를 계산한다. 
4) f(a)와f(p)의 부호가 같으면, 근은 p와 b사이에 존재하므로 p를 a라 놓고 다시 계산
5) f(a)와f(p)의 부호가 다르면, 근은 p와 a사이에 존재하므로 p를 b라 놓고 다시 계산
6) 근이 있는 점들의 간격이 허용치보다 작으면 계산은 종료
7) 반복횟구가 허용치를 넘어도 계산 종료
8) 함수 f(p)가 0에 가까우면 p가 근이 되므로 계산 종료. 

    
    program mainprocedure
    implicit none
    integer :: i, maxit    ! 4바이트 정수형 선언
    real(kind=16) :: a, b, x, p, fa, fb, fp, tol, f    ! 16바이트 실수형 선언

    f(x) = ( x + 4 ) * x * x - 10       !   문함수로서 프로시저 내에서의 한줄 함수식을 표현
10  print *, ' type a and b : '
    read *, a, b
!! 이하 이분법 계산과정    
    if ( a > b ) then 
        x = a
        a = b
        b = x
    end if
    fa = f(a)
    fb = f(b)
    if ( fa * fb > 0.0 ) then 
        print *, 'f(a) and f(b) have same signs ! ' 
        goto 10
    else
        print *, ' Input tolerance '
        read *, tol
        print *, ' Input maximum number of iterations ' 
        read *, maxit
    end if


loop : do i = 1, maxit         ! 구조명 loop 인 순환구조 시작. 다중 구조의 경우, 구조명으로 분리하는게 편리
        p = a + ( b - a ) /2 
        fp = f(p)

outer : if(abs(fp) <= 1.0e-20 .or. (b-a)/2 < tol) then  ! 구조명 outer 인 순환구조 시작
            print *, ' Final results ' 
            print *, 'p, i, tol ', p, i, tol
            exit loop                ! 순환구조를 완전히 벗어나는 분기 명령어
        else
            print *, 'p, i, tol ', p, i, tol    
inner :     if (fa*fp > 0) then        ! 구조명 inner 인 순환구조 시작
                a = p         
                fa = fp    
            else        
                b = p         
                fb = p    
            end if inner        
        end if outer
end do loop    
pause
end program mainprocedure
728x90
반응형