리포트 문제로 요즘 배껴쓰기 수준으로 포트란을 하고 있습니다.
그런데 문제가 발생했는데요..어디가 잘못되었는지 도저히 알수가 없습니다.
최적설계 수정뉴톤법인데요. 책에 있는 예제 내용을 그대로 배낀겁니다.
포트란으로 작성한 파일은 첨부 했습니다.
컴파일시 에러가 뜨지않는데요.
build 실행시 에러가 납니다.
아래내용은 포트란 소스입니다.
소스밑에 에러 메쎄지도 첨부합니다.
오늘까지 제출해야 되는데...염치없이 이렇게 머리숙여 부탁드립니다.
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
DIMENSION X(3), D(3), G(3), H(3,3) , WK(3)
DELTA = 5.0D-2
EPSLON = 1.0D-4
EPSL = 5.0D-3
NCOUNT = 0
NDV = 3
NOC = 100
X(1) = 2.0D0
X(2) = 4.0D0
X(3) = 10.0D0
CALL GRAD(X,G,NDV)
WRITE(*,10)
10 FORMAT('NO.COST FUNCT STEP SIZE','NORM OF GRAD')
DO 20 K=1, NOC
CALL HASN(X,H,NDV)
CALL SCALE (G,D,-1.0D0,NDV)
CALL SYSEQ(H,NDV,D)
IF(DOT(G,D,NDV).GE.1.0E-8) GO TO 60
CALL GOLDM(X,D,WK,ALFA,DELTA,EPSLON,F,NCOUNT,NDV)
CALL SCALE (D,D,ALFA,NDV)
CALL PRINT(K,X,ALFA,G,F,NDV)
CALL ADD(X,D,X,NDV)
CALL GRAD(X,G,NDV)
IF(TNORM(G,NDV) .LE. EPSL) GO TO 30
20 CONTINUE
WRITE(*,*)
WRITE(*,*)' LIMIT ON NO. OF CYCLES HAS EXCEEDED'
WRITE(*,*)' THE CURRENT DESIGN VARIABLES ARE:'
WRITE(*,*) X
CALL EXIT
30 WRITE(*,*)
WRITE(*,*) 'THE OPTIMAL DESIGN VARIABLES ARE:'
WRITE (*,40) X
40 FORMAT(4X,3F15.6)
CALL FUNCT(X,F,NCOUNT,NDV)
WRITE(*,50)'OPTIMUM COST FUNCTION VALUE IS:', F
50 FORMAT(A, F13.6)
WRITE (*,*) 'NO. OF FUNCTION EVALUATIONS ARE', NCOUNT
CALL EXIT
60 WRITE(*,*)
WRITE(*,*)' DESCENT DIRECTION CANNOT BE FOUND'
WRITE(*,*)' THE CURRENT DESIGN VARIABLES ARE:'
WRITE(*,40) X
STOP
END
DOUBLE PRECISION FUNCTION DOT(X,Y,N)
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
DIMENSION X(N),Y(N)
SUM = 0.0D0
DO 10 I = 1, N
SUM = SUM + X(I) * Y(I)
10 CONTINUE
DOT=SUM
RETURN
END
SUBROUTINE HASN(X,H,N)
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
DIMENSION X(N),H(N,N)
H(1,1)=2.0D0
H(2,2)=4.0D0
H(3,3)=4.0D0
H(1,2)=2.0D0
H(1,3)=0.0D0
H(2,3)=2.0D0
H(2,1)=H(1,2)
H(3,1)=H(1,3)
H(3,2)=H(2,3)
RETURN
END
SUBROUTINE SYSEQ(A,N,B)
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
DIMENSION A(N,N),B(N)
M=0
50 M=M+1
MM=M+1
B(M)=B(M)/A(M,M)
IF(M-N) 70, 130, 70
70 DO 80 J = MM, N
A(M,J)=A(M,J)/A(M,M)
80 CONTINUE
DO 120 I = MM, N
IF(A(I,M))90,120,90
90 DO 100 J = I, N
A(I,J)=A(I,J)-A(I,M)*A(M,J)
A(J,I)=A(I,J)
100 CONTINUE
B(I)=B(I)-A(I,M)*B(M)
120 CONTINUE
GO TO 50
130 M = M - 1
MM = M + 1
DO 140 J = MM,N
B(M)=B(M)-A(M,J)*B(J)
140 CONTINUE
GO TO 130
150 RETURN
END
-------------------------------------------------
에러 메세지
--------------------Configuration: newton - Win32 Debug--------------------
Linking...
newton.obj : error LNK2001: unresolved external symbol _GRAD@12
newton.obj : error LNK2001: unresolved external symbol _SCALE@16
newton.obj : error LNK2001: unresolved external symbol _GOLDM@36
newton.obj : error LNK2001: unresolved external symbol _PRINT@24
newton.obj : error LNK2001: unresolved external symbol _ADD@16
newton.obj : error LNK2001: unresolved external symbol _TNORM@8
newton.obj : error LNK2001: unresolved external symbol _FUNCT@16
Debug/newton.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.
newton.exe - 8 error(s), 0 warning(s)
--------------------------------------------------------------------------
카페 게시글
포트란 Q&A
newton.obj : error LNK2001: - 에러좀 해결 부탁드립니다.(--)(__)(--)
북마크
번역하기
공유하기
기능 더보기
다음검색
첫댓글 에러 메시지를 보아서는 맨 마지막에 나오는 이름들이 정의되어 있지 않아서 그렇습니다. 처음에 나오는 것을 보면 GRAD라는 subroutine이 정의 되어 있지 않았다는 뜻입니다. 위의 소스코드를 보면 subroutine GRAD(...)라는 것을 찾을 수가 없네요.
서브루틴이 없네요...그것 찾아서 서브루틴 붙이세요.