该计划必须计算ƒ=3.1*x^2-5.3/x
和x=1/2
之间x=3/2
曲线的长度。长度应计算为以{开头的n
个线段的总和{1}},以n=1
结尾。
我真的无法找到为什么我得到的结果是错误的。例如,如果n=20
和x1=1/2
,那么当我得到13时,我得到110
我给你的代码如下:
x2=3/2
答案 0 :(得分:2)
每当您遇到涉及某个功能的问题时,请执行创建一个功能。它一定会让生活变得更加轻松!
它可以帮助您调试,因为您可以立即确定您的函数是否实际执行了正确的计算。
您的代码存在许多问题,您将整数与真实混合在一起,从不这样做。它最终会给你带来麻烦。理想情况下,所有内容都应使用selected_real_kind
和相关的精确标识0._dp
或0._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
底线,编码并不总是直接在实现中,但上面的代码很清楚,你会很容易发现任何引入的错误,因为每行只有几个操作,请尝试并坚持这种方法,它肯定会帮助你以后......