program prob_1
implicit real*8(a-h, o-z)
f(x) = x**2-cos(x)
df(x) = 2*x+sin(x)
x0 = 0, x1 = 1
do i = 1, 3
if (f((x0+x1)/2) < 0)
x0 = (x0+x1)/2
else
x1 = (x0+x1)/2
end do
print *,"x = ", x
end program
我刚刚开始使用Fortran 90。 现在,我正在使用Code :: blocks,但我不确切知道错误所在的行。
我想问题是f((x0+x1)/2) < 0
,但实际上不知道真正的错误是什么。
这是什么问题?
答案 0 :(得分:5)
请注意,OP使用的函数定义陈述函数已过时。
B.3.4语句功能
- 语句功能受到许多非直观的限制,并且可能会导致错误,因为它们的语法很容易与赋值语句的语法混淆。
- 内部函数是语句函数的更通用形式,并且完全替代了它。
符号REAL*8
或任何形式的东西从来都不是任何Fortran标准的一部分(请参阅here):
我建议将代码重写为:
program prob_1
implicit none
double precision :: x1,x0
integer :: i
x0 = 0; x1 = 1
do i = 1, 3
if (f((x0+x1)/2.0D0) < 0) then
x0 = (x0+x1)/2.0D0
else
x1 = (x0+x1)/2.0D0
endif
end do
print *,"x = ", (x0+x1)/2.0D0
contains
function f(x)
double precision, intent(in) :: x
double precision :: f
f = x**2-cos(x)
end function f
function df(x)
double precision, intent(in) :: x
double precision :: df
df = 2.0D0*x+sin(x)
end function df
end program
答案 1 :(得分:3)
如果按以下方式更改程序,则它将编译:
program prob_1
implicit real*8(a-h, o-z)
f(x) = x**2-cos(x)
df(x) = 2*x+sin(x)
x0 = 0; x1 = 1
do i = 1, 3
if (f((x0+x1)/2) < 0) then
x0 = (x0+x1)/2
else
x1 = (x0+x1)/2
endif
end do
print *,"x = ", x
end program
如评论中所述,您必须添加分号;
以将一行中的语句分开,并且必须将then
和endif
添加到{{1 }}条件。
希望有帮助。