2016-10-17 4 views
1
program main 
call findbracket(x0, a, b) 
end program 

function f(x) 
double precision x,f 
f = x 
end function 

subroutine findbracket(x0,a,b) 
double precision x0, a, b 
double precision fa, fb 
double precision dx 
dx = 0.001d0 
x0 = 1.0d0 
a = x0 
b = x0 
print*, a, b 
print*, f(a) 
print*, f(b) 

do 
fa = f(a) 
fb = f(b) 

print*, "what is fa", fa 
print*, "what is fb", fb 
a = a - dx 

if (fa*fb < 0) then 
     exit 
end if 
print*, b, dx 
b = b + dx 
if (fa*fb < 0) then 
     exit 
end if 

dx = dx*2 

end do 

end subroutine 

Я пишу программу, которая решает корень данной функции f (x). На этом этапе я просто хочу проверить, не получаю ли я правильное значение для каждого шага, и я заметил некоторые ошибки. Чтобы сделать его простым, у меня есть функция f (x) = x, и я ожидал, что программа будет печатать f (a) = 1.0 и f (b) = 1.0, но выход будет f (a) = 1,8750000000000000 и f (b) = 0,0000000000000000. Плюс, хотя я устанавливаю как a, так и b равным x0, он выглядит как a = 1.0000002381857485 и b = 1.0000000000000000. Может ли кто-нибудь объяснить, почему это происходит? Возможно, мне не хватает чего-то глупого, но я не могу найти его. Я ценю вашу помощь.Fortran 90 странное поведение

+0

Заменить строку 'end program' на строку, содержащую слово' contains'. В конце исходного файла, содержащего весь ваш код, добавьте строку 'end program'. Затем сразу же после начала строки 'program' (поэтому после этой первой строки) вставьте строку' implicit none'. Затем (перекомпилировать) и посмотреть, что вы сказали компилятору. –

+0

Я определил x0 = 1.0d0, a = x0, b = x0 в основной программе, и теперь он работает так, как я предполагал. И a, и b печатают ровно 1.0. Но у меня все еще есть проблема с функцией. fa и fb print 0.0000000000000000. Я не уверен, почему функция работает таким образом. – mike

+0

Альтернативно к подходу 'contains' вы можете просто добавить' implicit none' в подпрограмму (и в другом месте, в идеале). Это поможет вам сделать вывод о том, что 'f' в подпрограмме является функцией с результатом' real' not 'double precision'. Естественно, это должно быть последнее. – francescalus

ответ

0

Добавьте эти строки в подпрограмме

subroutine findbracket(x0,a,b) 
double precision x0, a, b 
double precision fa, fb 
double precision dx 

interface 
    function f(x) 
    double precision x,f 
    end function 
end interface 

то вы должны получить правильное значение для F (х).

Редактировать:

Интерфейс делает функцию F (X) видимый (и годная к употреблению) в подпрограмме.

+1

Всегда полезно объяснить, почему добавить эту строку, что они означают. –