회귀 분석

온도와 부피의 회귀분석

온도 : 독립변수, 부피 : 종속변수

파일에서 온도와 부피를 읽어와 처리

PROGRAM Temp_Vol

IMPLICIT NONE

INTEGER :: Count = 0, OpenStatus, InputStatus
CHARACTER(20) :: FileName
REAL :: Temperature, Volume, SumOfTemps = 0.0, SumOfTemps2 = 0.0, &
SumOfVols = 0.0, SumOfProds = 0.0, MeanTemperature, &
MeanVolume, Slope, Y_Intercept

WRITE (*, '(1X, A)', ADVANCE = "NO") "자료 파일 이름(20자 이내)을 입력하시오 : "
! 한 띄고 출력, ADVANCE = "NO"는 출력하고 그 줄바꿈 하지 않음
READ *, FileName

OPEN (UNIT = 15, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)
! 파일을 열어 15이라 함. STATUS = "OLD"는 기존의 존재하는 파일
! IOSTAT = OpenStatus는 파일 오픈한 결과를 할당. 0 이면 성공적으로 open, 0 초과이면 못 연 것

IF (OpenStatus > 0) THEN
STOP "*** 파일을 열 수 없음 ***"
END IF

PRINT *
PRINT '(1X, A11, A10)', "Temperature", "Volume"
PRINT '(1X, A11, A10)', "===========", "======="

DO

READ (UNIT = 15, FMT = '(4X, F4.1, T13, F4.1)', IOSTAT = InputStatus) Temperature, Volume
! 파일 15의 자료를 읽는다. IOSTAT = InputStatus는 읽은 결과를 할당. 양의 값-입력오류, 음의 값-데이터의 끝, 0-잘 읽음

IF (InputStatus > 0) THEN
STOP "*** 입력 에러 ***" ! 프로그램 종료하기
END IF

IF (InputStatus < 0) THEN
EXIT ! DO 루프 빠져나가
END IF

PRINT '(1X, F8.1, F12.1)', Temperature, Volume
Count = Count + 1
SumOfTemps = SumOfTemps + Temperature
SumOfTemps2 = SumOfTemps2 + Temperature ** 2
SumOfVols = SumOfVols + Volume
SumOfProds = SumOfProds + Temperature * Volume

END DO

CLOSE(15)
! 15번 파일을 닫는다.

MeanTemperature = SumOfTemps / REAL(Count)
MeanVolume = SumOfVols / REAL(Count)

PRINT *
PRINT '(1X, A, F6.2, A, F6.2)', "평균 온도 =", MeanTemperature, " ; 평균 부피 =", MeanVolume

Slope = (SumOfProds - SumOfTemps * MeanVolume) / (SumOfTemps2 - SumOfTemps * MeanTemperature)
Y_Intercept = MeanVolume - Slope * MeanTemperature

PRINT '(/1X, "회귀식" /1X, " y =", F5.1, "x + ", F5.1, /1X, "여기서 x는 온도, y는 부피")', Slope, Y_Intercept

END PROGRAM Temp_Vol

위 소스를 05_01_Temp_Vol.f95 로 저장

자료 파일

1200034203221015
1300038803221121
1400044803241425
1500051303201520
1600055503181665
1700061303191865
1800067503232080
1900072103282262
2000076803252564
2100083503272869
2200088903303186

위 자료 파일을 05_01_Temp_Vol.dat 로 저장

컴파일 및 프로그램 테스트



출력 서식 지정

PROGRAM Prin

IMPLICIT NONE

INTEGER :: Num = 3, L = 5378, Kappa = -12345
REAL :: A1 = 7.5, B1 = 0.182, C1 = 625.327
REAL :: A2 = .12345E8, B2 = .0237, C2 = 4.5E-12, D2 = -76.1684E12
REAL :: A3 = 0.3, B3 = 7.9
INTEGER :: A4 = 141

PRINT '(1X, 2I5, I7, I10)', Num, Num - 3, L, Kappa
PRINT '(1X, 2I5.2, I7, I10.7)', Num, Num - 3, L, Kappa
PRINT '(1X, 2I5.0, I7, I10)', Num, Num - 3, L, Kappa

PRINT *,

PRINT '(1X, 2F6.3, F8.2)', A1, B1, C1

PRINT *,

PRINT '(1X, 2E15.5, 2E15.4)', A2, B2, C2, D2

PRINT *,

PRINT '(1X, "X =", F6.2, " Y =", F6.2)', A3, B3
PRINT '(1X, A, F6.2, A, F6.2)', "X =", A3, " Y =", B3

PRINT *,

PRINT '(1X, A11, 3X, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
PRINT '(1X, A11, T16, A4, 2X, I3)',"John Q. Doe", "CPSC", A4

PRINT '(1X, I10, 3/ 1X, 2I10, // 1X 3I10)', A4, A4, A4, A4, A4, A4

END PROGRAM Prin

위 소스를 c.f95로 저장

컴파일 및 출력 확인



PRINT '(1X, 2I5, I7, I10)', Num, Num - 3, L, Kappa
두 개의 5칸을 차지하는 정수 출력(2I5), 7칸 차지하는 정수 출력(I7), 10칸 차지하는 정수 출력(I10)

PRINT '(1X, 2I5.2, I7, I10.7)', Num, Num - 3, L, Kappa
두 개의 5칸을 차지하나 최소한 2개는 꼭 정수 출력(2I5.2), 7칸 차지하는 정수 출력(I7), 10칸 차지하는 그러나 최소 7개는 꼭 정수 출력(I10)

PRINT '(1X, 2I5.0, I7, I10)', Num, Num - 3, L, Kappa


PRINT '(1X, 2F6.3, F8.2)', A1, B1, C1
두 개의 6칸을 차지하고 소수점 아래가 3칸을 차지하는 실수 출력(2F6.3), 8칸을 차지하고 소수점 아래가 2칸을 차지하는 정수 출력


PRINT '(1X, 2E15.5, 2E15.4)', A2, B2, C2, D2
두 개의 15칸을 차지하고 유효자리수가 5개의 실수 출력(2E15.5), 2개의 15칸을 차지하고 유효자리수가 4개인 실수 출력(2E15.4)


PRINT '(1X, "X =", F6.2, " Y =", F6.2)', A3, B3
PRINT '(1X, A, F6.2, A, F6.2)', "X =", A3, " Y =", B3
문자 출력을 형식 지정에서도 할 수 있고, 변수 나열에서도 할 수 있음


PRINT '(1X, A11, 3X, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
11칸을 차지하는 문자 출력(A11), 3칸의 공백(3X), 4칸의 문자 출력(A4), 2칸의 공백(2X), 3칸의 정수 출력(I3)

PRINT '(1X, A11, T16, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
T16은 16칸에서 시작한다는 뜻


PRINT '(1X, I10, 3/ 1X, 2I10, // 1X 3I10)', A4, A4, A4, A4, A4, A4
3/는 세 번의 엔터를 친 효과, //은 두 번의 엔터를 친 효과

DO WHILE 을 이용한 온도 변환

섭씨온도를 화씨온도로 변환

계속 변환할 지 결정

-40도씨 이상만 변환

PROGRAM Temp

IMPLICIT NONE

REAL :: Celsius, Fahrenheit
CHARACTER :: Response = "Y"

DO WHILE (Response /= "N")

PRINT *, "-40도씨 이상의 섭씨 온도를 입력하시오(ex:36)"
READ *, Celsius

IF (Celsius >= -40) THEN
Fahrenheit = 1.8 * Celsius + 32.0

PRINT *,"섭씨온도 ", Celsius, " = 화씨온도 ", Fahrenheit

PRINT *
PRINT *, "온도 변환을 더 하시겠습니까? 그만 두려면 N을 입력하시오."
READ *, Response
END IF

END DO

END PROGRAM Temp

위 소스를 b.f95로 저장

컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

회귀 분석(파일 처리, 입력 서식 지정)  (0) 2008.09.02
출력 서식 지정  (0) 2008.08.29
온도변환(DO, EXIT, CYCLE, END DO)  (0) 2008.08.28
감가상각 (DO, END DO)  (0) 2008.08.27
곱셈표 (DO, END DO)  (0) 2008.08.27

섭씨 온도를 화씨온도로 변환하기

계속 반복하여 계산할 지 결정

-40도씨 이상만 변환

PROGRAM Temp

IMPLICIT NONE

REAL :: Celsius, Fahrenheit
CHARACTER :: Response

DO

PRINT *, "-40도씨 이상의 섭씨 온도를 입력하시오(ex:36)"
READ *, Celsius

IF (Celsius < -40) THEN
PRINT *,"-40도씨 이상의 섭씨 온도만 처리합니다."
CYCLE ! DO loop의 처음으로 이동
END IF

Fahrenheit = 1.8 * Celsius + 32.0

PRINT *,"섭씨온도 ", Celsius, " = 화씨온도 ", Fahrenheit

PRINT *
PRINT *, "온도 변환을 더 하시겠습니까 (Y or N)?"

READ *, Response

IF (Response == "N" .OR. Response == "n") EXIT ! N라고 하면 DO loop 종료

END DO

END PROGRAM Temp


위 소스를 04_03_Temp.f95로 저장

컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

출력 서식 지정  (0) 2008.08.29
온도 변환(DO WHILE, END DO)  (0) 2008.08.28
감가상각 (DO, END DO)  (0) 2008.08.27
곱셈표 (DO, END DO)  (0) 2008.08.27
반가수기(.OR. .AND. .NOT)  (0) 2008.08.27

감가상각표 구하기

초기 구입가, 사용 연한 연도, 사용후 잔여가치를 입력

총 감가되는 가치 = 초기 구입가 - 잔여가치

총 사용 연한 = 1 + 2 + ... + 사용 연한 연도 = 연도 * (연도 + 1) /2

1개년 가치 = 총 감가상각 가치 / 총 사용연한

초년도에 가장 많은 감가상각 : (사용연한 - 구하려는 연도 + 1) * 1개년 가치

PROGRAM Depre

IMPLICIT NONE

REAL :: Price, SalvageValue, Amount, ValuePerYear
INTEGER :: UsefulLife, Year, Sum

PRINT *,"초기 구입 가격, 사용 연한, 사용후 잔여가치를 입력하시오(ex:20000, 5, 5000)"
READ *, Price, UsefulLife, SalvageValue

Amount = Price - SalvageValue

Sum = UsefulLife * (UsefulLife + 1) / 2

ValuePerYear = Amount / Sum

Print *,
Print *," Year Depreciation"
Print *,"=========================="

DO Year = 1, UsefulLife

PRINT *, Year, ValuePerYear * (UsefulLife - Year + 1)

END DO

END PROGRAM Depre

위 소스를 04_02_Depre.f95로 저장

컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

온도 변환(DO WHILE, END DO)  (0) 2008.08.28
온도변환(DO, EXIT, CYCLE, END DO)  (0) 2008.08.28
곱셈표 (DO, END DO)  (0) 2008.08.27
반가수기(.OR. .AND. .NOT)  (0) 2008.08.27
오염지수 구하기 3(SELECT CASE)  (0) 2008.08.27

+ Recent posts