Fortran Coder

查看: 22710|回复: 11
打印 上一主题 下一主题

[求助] 每隔不同时间段的位移量平方的总和--问题

[复制链接]

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

楼主
发表于 2014-4-30 08:42:25 | 显示全部楼层
文件结束的情况你没判断吧?

根据你的数据,我把 write(* , * ) s 移动到 if ( d < 0 ) then 里面去,输出结果如下:

   11.86880
   14.82880
   16.40640
   16.80640
   17.35040
   28.50240
   44.11840
   45.28640
forrtl: severe (24): end-of-file during read, unit 13, file F:\Developer\MyProje
ct\t\Console1\222.txt


除了最后文件读到结束以后弹错,前面还是有计算结果的。不知道是否是你想要的?

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2014-4-30 15:14:19 | 显示全部楼层
对不起,理解不了。建议你仅以一个数据来距离说明。不要一会 0.02,一会0.04,一会0.08 的

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2014-5-1 08:07:07 | 显示全部楼层
描述一个需求,是一个费力的事情。

关于你的需求,大概懂了你的意思,但还有几个问题不敢确定。再问就不好意思了,我做一些假定吧。

1.假定第一个一定是 t = 0.0
2.假定 t 一定是递增的
3.假定每一个时间间隔内(即 0.01 秒)至少存在两个数。(也就是不会出现 t = 0.029 然后忽然蹦到 t = 0.053)

下面是在这三个假设上写的代码,如果上面的假设不成立。则程序需要更复杂一点。
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  implicit none
  Type ST_R
    Real :: x , y , t
  End Type ST_R  
  Type ( ST_R ) , target :: stRead , stLast , stLastRec !// 当前读取记录,上次读取记录,上次位移位置
  Type ( ST_R ) , pointer :: pst
  Real :: rTE = 0.0001 !// 时间精度
  Real :: rSep = 0.01 !// 时间间隔
  real :: s , t !// 平方和 , 当前搜索的时间
  integer :: iErr
  s = 0.0
  open ( 13 , File = '222.txt' )
  Read( 13 , * ) stLast%x , stLast%y , stLast%t
  stLastRec = stLast
  t = rSep
  Do
    Read( 13 , * , ioStat = iErr ) stRead%x , stRead%y , stRead%t
    If ( iErr /= 0 ) Exit
    If ( ( stRead%t > (t-rTE) ).and.( stLast%t < (t+rTE) ) ) then !// 等效于 stRead%t>=t and stLast%t<=t
      if ( abs(stRead%t - t ) > abs(stLast%t - t ) ) then !// 比较前后两组哪个更接近
        pst => stLast
      else
        pst => stRead
      end if
      write(*,'(4f13.6)') pst , t
      s = s + (pst%x - stLastRec%x)**2 + (pst%y - stLastRec%y)**2
      stLastRec = pst !// 上次记录位移位置为 pst
      t = t + rSep
    End If
    stLast = stRead
  End Do  
  write( * , * ) s
  close( 13 )
End Program www_fcode_cn

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2014-5-1 08:13:33 | 显示全部楼层
另外,你确定是平方和?
s = s + (pst%x - stLastRec%x)**2 + (pst%y - stLastRec%y)**2
而不是平方和的平方跟???
s = s + sqrt( (pst%x - stLastRec%x)**2 + (pst%y - stLastRec%y)**2 )
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-12 16:45

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表