无法在此Fortran代码中的f(x)中输入值吗?

时间:2019-12-05 05:13:08

标签: fortran

    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,但实际上不知道真正的错误是什么。 这是什么问题?

2 个答案:

答案 0 :(得分:5)

请注意,OP使用的函数定义陈述函数已过时。

  

B.3.4语句功能

     
      
  1. 语句功能受到许多非直观的限制,并且可能会导致错误,因为它们的语法很容易与赋值语句的语法混淆。
  2.   
  3. 内部函数是语句函数的更通用形式,并且完全替代了它。
  4.   
     

来源:F2018 Standard

符号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

如评论中所述,您必须添加分号;以将一行中的语句分开,并且必须将thenendif添加到{{1 }}条件。

希望有帮助。