2016-10-17 3 views
0
program main 
implicit none 
double precision p, a, b, tol 
a = 1.0d0 
b = 30.0d0 
tol = 1e-8 
call newtonbisection(p, a, b, tol) 

contains 

function f(x) 
implicit none 
double precision x,f 
f = SIN(X) - exp(-x) 
end function 

function fprime(x) 
implicit none 
double precision fprime, x 
fprime = COS(x) + exp(-x) 
end function 

subroutine newtonbisection(p, a, b, tol) 
implicit none 
double precision p, a, b, tol 
double precision f, fprime 
double precision fb, fp, fp2 

a = 1.0d0 
b = 30.0d0 

p = a 

do 
fb = f(b) 
fp = f(p) 
fp2 = fprime(p) 

p = p - (fp/fp2) 

if (p < a .or. p > b) then 
    p = (a+b)/2.d0 
end if 

if (fp*fb < 0) then 
    a = p 
else 
    b = p 
end if 
print*, "a, b, p, fp", a, b, p, fp 

if (dabs(fp) < tol) then 
    exit 
end if 

end do 

end subroutine 

end program 

는 :정의되지 않은 F_을 참조하고 나는 다음과 같은 오류가납니다 (gfortran newtonbisection.f90)를 컴파일 할 때 fprime_

newtonbisection.f90:(.text+0x76): undefined reference to 'f_' 

newtonbisection.f90:(.text+0x8f): undefined reference to 'f_' 

newtonbisection.f90:(.text+0xa8): undefined reference to 'fprime_' 

collect2: ld returned 1 exit status 
나는 비슷한 문제가 암시 없음을 넣어하지되었다

마지막으로 고정 포함 그들이지만, 이번에는 아닙니다. 왜 그것이 f와 fprime이 정의되어 있지 않다고 말하는가?

+1

프로그램에 더 들여 쓰기를 사용하는 것이 좋습니다. 코드를 읽기가 어렵습니다. –

+0

제안 해 주셔서 감사합니다. 나는 다음 번에 그것을 명심 할 것이다. – mike

답변

1

당신은 서브 루틴 newtonbisection

double precision f, fprime 

로 라인을 넣어 수 없습니다. 즉, ffprime은 외부 기능이지만, 그렇지 않은 경우에는 기본 프로그램의 내부 기능입니다.

해당 행을 삭제하십시오. 내부 기능은 소위 호스트 연결으로 인해 다른 기능을 볼 수 있습니다. 모두 단일 호스트 프로그램에 포함되어 있습니다.

또한 내부 함수와 서브 루틴은 implicit none을 반복 할 필요가 없으며 주 프로그램의 implicit none이 내부에 포함되어 있기 때문에 유효합니다.

+0

아하이 봐요. 고맙습니다. 사실 그 선이 필요하지 않습니다. 선을 지우고 나면 괜찮습니다.하지만 이제는 무한 루프에 빠지게됩니다. 나는 그것이'if (p < a .or. p > b) then'의 줄 때문인지 의심 스럽다. 나는 p가 바운드를 벗어나는 경우를 원했습니다. [a, b]. 나는 이전에 포트란 프로그래밍에서 "또는"을 사용하지 못했지만 이것이 인터넷 검색에서 올바른 방법 인 것으로 보인다. 이 올바른지? – mike

+0

이것은 새로운 문제이며 새로운 질문을 보장합니다. 코드를 조금씩 사용 해보고 문제가 지속되면 새로운 질문을하십시오. –

+0

알겠습니다. 고맙습니다. – mike