在Fortran中使用功能块 - Newton Raphson

时间:2014-05-06 01:32:27

标签: fortran

我正在尝试为Newton Raphson应用功能块而且有点迷失。我的脚本假设要求用户输入初始X,因为我已经对方程进行了硬编码。我的输出文件似乎只是声明零而不是正确的输出列出它的收敛。我假设我的写作陈述错误或过早?任何帮助表示赞赏。

旁注...是否可以像其他语言一样询问用户方程式和初始值?

program main

  implicit none

  real :: x0, xn, err
  write(*,*) "Please enter an initial guess X0."
  read(*,*) x0
  write(*,*) "x = ", xn, " error = ", err

end program main

real function f(x0)
  real :: x0, xn,

  do
    xn = x0 - ( (x0**3 - (x0) - 1) / ( ( 3*(x0**2) )-1) )
    err = 100*abs( (xn-x0)/x0 )
    x0 = xn
    if (err < 0.000001)exit
    return
  end do

end function

2 个答案:

答案 0 :(得分:1)

在您的代码中,您永远不会调用函数f,那么您希望程序如何工作?

即使您调用了f,在函数f中声明和设置的变量xn和err也是该函数的本地变量,并且它们不会更改主程序中x0和xn的值。使用子例程将多个值传递回主程序。

答案 1 :(得分:0)

正如@Fortranner所说,你需要调用该函数。如果将子程序和函数放在模块中,并且use来自调用程序的模块,您将发现Fortran编程更容易。有关此组织的示例,请参阅Computing the cross product of two vectors in Fortran 90

Re“是否可以向用户询问方程式和初始值”?这是一个非常普遍的问题。如果等式总是多项式,则可以轻松地向用户询问系数的值。或者你可以有一个方程列表供选择。但是在运行时输入一个完全随意的等式就像要求在Fortran中编写脚本语言 - 这绝对是非平凡的。

我建议在开发一个程序时使用所有可用的警告并检查编译器的选项。例如,使用此类选项gfortran指出您没有在函数f中定义f的返回值。这暗示主程序和功能之间的通信存在问题。