Fortran曲线的弧长

时间:2015-11-17 13:43:51

标签: fortran fortran95

该计划必须计算ƒ=3.1*x^2-5.3/xx=1/2之间x=3/2曲线的长度。长度应计算为以{开头的n个线段的总和{1}},以n=1结尾。

我真的无法找到为什么我得到的结果是错误的。例如,如果n=20x1=1/2,那么当我得到13时,我得到110 我给你的代码如下:

x2=3/2

1 个答案:

答案 0 :(得分:2)

每当您遇到涉及某个功能的问题时,请执行创建一个功能。它一定会让生活变得更加轻松!

它可以帮助您调试,因为您可以立即确定您的函数是否实际执行了正确的计算。

您的代码存在许多问题,您将整数与真实混合在一起,从不这样做。它最终会给你带来麻烦。理想情况下,所有内容都应使用selected_real_kind和相关的精确标识0._dp0._sp或您为精确命名的任何内容进行定义。

这是一个计算段长度的代码,收益率高于13。

program pr2_ex2
  implicit none
  integer, parameter :: dp = selected_real_kind(p=15)

  integer :: i
  double precision :: dy, dx, dxsq
  double precision :: x1, x2, s, x
  double precision :: length

  integer :: N 

  ! perhaps read in N as well?
  N = 20

  print*,"Please enter the function's starting point"
  !  read*,x1
  x1 = 0.5_dp
  print*,"Please enter the function's ending  point"
  ! read*,x2
  x2 = 1.5_dp

  ! are you allowed to have x2 < x1, if so abort?
  ! dx is always the same, so why calculate it all the time?
  dx = abs(x2 - x1) / real(N,dp)
  ! we need not calculate this all the time
  dxsq = dx ** 2

  ! Total length
  length = 0._dp
  do i = 1 , N 

     ! starting x of this segment
     x = x1 + dx * (i-1)

     ! Get current delta-y
     dy = f(x + dx) - f(x)

     ! calculate segment vector length
     s = sqrt(dxsq + dy ** 2)

     ! sum total length
     length = length + s

  end do

  print*,length

contains

  function f(x) result(y)
    double precision, intent(in) :: x
    double precision :: y

    y = 3.1_dp * x ** 2 - 5.3_dp / x

  end function f

end program pr2_ex2

底线,编码并不总是直接在实现中,但上面的代码很清楚,你会很容易发现任何引入的错误,因为每行只有几个操作,请尝试并坚持这种方法,它肯定会帮助你以后......