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. Может ли кто-нибудь объяснить, почему это происходит? Возможно, я упускаю какую-то глупость, но я не могу этого найти. Я ценю вашу помощь.
end program
строкой, содержащей словоcontains
. В конце исходного файла, содержащего весь ваш код, добавьте строкуend program
. Затем сразу после начала строкиprogram
(т.е. после этой первой строки) вставьте строкуimplicit none
. Затем (повторно) скомпилируйте и посмотрите, что вам скажет компилятор. - person High Performance Mark   schedule 17.10.2016contains
вы можете просто добавитьimplicit none
в подпрограмму (а в идеале и где-нибудь еще). Это поможет вам сделать вывод, чтоf
в подпрограмме - это функция с результатомreal
, а неdouble precision
. Естественно, должно быть последнее. - person francescalus   schedule 17.10.2016implicit none
выше, у нас есть документация по структуре программы. По сути, если вы не пойдете наcontains
подход, упомянутый первым, тогдаf
в подпрограмме необходимо соответствующим образом объявить:double precision f
(что дает ей неявный интерфейс). Безcontains
, содержащего и функцию, и подпрограмму, они обе являются внешними процедурами и ничего не знают друг о друге без явных подробностей. - person francescalus   schedule 17.10.2016