728x90
반응형
순환구조의 종류
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
반응형