PROGRAM NEWTON
DATA X1, ITER, TOL, IW / 30.0, 10, 0.000001, 1 /
WRITE(*,1000)
WRITE(*,1010)
CALL NT(X1,ITER,TOL,IW,I)
CALL FUNCT(X1, F1, FP1)
WRITE(*,1020) I, X1, F1
STOP
1000 FORMAT(' NEWTONS METHOD')
1010 FORMAT(' '/' I', 6X, 'XI',10X, 'FI', 12X, 'FPI', 11X, 'XI+1'/' ')
1020 FORMAT(I4,F12.4, F14.8)
END PROGRAM NEWTON
SUBROUTINE NT(X1,ITER,TOL,IW,I)
C NEWTON'S METHOD
DO I = 1, ITER
CALL FUNCT(X1,F1,FP1)
DX=-F1/FP1
X2=X1+dX
IF(IW.EQ.1) WRITE(*,1000) I, X1, F1, FP1, X2
X1 = X2
IF(ABS(dX).LE.TOL) RETURN
END DO
WRITE(*,1010)
RETURN
1000 FORMAT(I4,F12.4, 2F14.8, F12.6)
1010 FORMAT(' '/'ITERATION FAILED TO CONVERGE')
END
FUNCTION FUNCT(X,F,FP)
C EVALUATION THE NONLINEAR FUNCTION
DATA R1, R2, R3, ALPHA / 1.66666667, 2.5, 1.83333333, 40.0 /
RAD=ACOS(-1.0)/180.0
F=R1*COS(ALPHA*RAD)-R2*COS(X*RAD)+R3-COS((ALPHA-X)*RAD)
FP=(R2*SIN(X*RAD))-SIN((ALPHA-X)*RAD))
RETURN
END
Error : The return value of this function has not been defined [Funct]
Function FUNCT(X, F, FP)
첫댓글function문을 잘못 사용하셨습니다. function으로 정의를 하게 되면 return 되는 값(딱 하나만 return됩니다)이 funct에 저장이 됩니다. function 은 call 하는 것이 아닙니다. 위에서 처럼 함수값과 미분값을 모두 return을 하려면 function 문으로는 안 됩니다. 미분값만 return하고 싶으면 fp=funct(...) 이렇게 합니다
첫댓글 function문을 잘못 사용하셨습니다. function으로 정의를 하게 되면 return 되는 값(딱 하나만 return됩니다)이 funct에 저장이 됩니다. function 은 call 하는 것이 아닙니다. 위에서 처럼 함수값과 미분값을 모두 return을 하려면 function 문으로는 안 됩니다. 미분값만 return하고 싶으면 fp=funct(...) 이렇게 합니다
그냥 위의 코드에서 function funct(x, f, fp)를 그냥 subroutine funct(x, f, fp)라고 하시면 될 거 같습니다. 그리고 FP=... 에서 마지막 괄호는 하나 지워주세요. 갯수가 안 맞네요. ^^
질문이 하나 더 있는데요? RETURN이 의미하는게 무엇입니까?
procedure 를 main 함수로 되돌린다는 의미입니다. 당연히 main 에서는 stop 을 사용해서 끝났다는 것을 나타내구요. 물론 main 에서 stop 은 생략을 해도 상관이 없습니다. 더 자세한 사항은 고수님들께 return 하기로 하죠. ^^