Fortran Coder

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

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

[复制链接]

17

帖子

4

主题

0

精华

入门

F 币
80 元
贡献
50 点
跳转到指定楼层
楼主
发表于 2014-4-29 10:54:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想下面数据的每隔不同时间段的位移量平方的总和,例如每隔0.01秒,找一个接近这个时间的数据求这个时间的位移和上个时间,就是0.01秒之前那个位置的位移的平方,我不知道我的逻辑对不对,然后运行出来有问题,请大神帮我看下
数据
  10.00000       10.00000      0.0000000E+00
   9.560000       12.60000      4.0826998E-03
   6.560000       10.72000      5.7680998E-03
   8.000000       10.80000      9.9683004E-03
   9.880000       9.800000      1.1211000E-02
   8.880000       10.80000      1.4416700E-02
   9.360000       11.44000      1.6414599E-02
   7.480000       11.40000      1.8196600E-02
   8.600000       10.44000      2.1517800E-02
   10.04000       9.960000      2.4316000E-02
   8.960000       10.96000      2.7926801E-02
   8.360000       10.52000      3.0301800E-02
   9.440000       10.40000      3.3982001E-02
   10.36000       10.52000      3.5854898E-02
   12.60000       11.48000      3.9078299E-02
   9.040000       9.920000      4.2032901E-02
   8.920000       10.04000      4.6360001E-02
   8.200000       10.12000      4.9344700E-02
   8.880000       8.960000      5.1477201E-02
   8.640000       9.360000      5.4022800E-02


程序
[Fortran] 纯文本查看 复制代码
program example
     implicit none
     integer :: i , o
     real :: x , y  , l , m , n , t , s ,d
     real :: x1 , x2 , y1 , y2 , t1 , t2 , t0
     d = 0
     s = 0
     x = 0
     y = 0
     open ( 13 , File = '222.txt' )
     do o = 1 , 100
         t = o * 0.01
             do i = 1 ,100
                 read ( 13 , * ) x1 , y1 , t1
                 read ( 13 , * ) x2 , y2 , t2
                 d = ( t1 - t ) * ( t1 - t ) - ( t2 - t ) * ( t2 - t )
                 if ( d < 0 ) then 
                 l = ( x1 - x ) * ( x1 - x ) + ( y1 - y ) * ( y1 - y )
                 s = s + l
                 else 
                 end if
                 x = x1
                 y = y1
             end do
     end do
     close( 13 )
     write ( * ,* ) s
     end program example

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-4-29 13:44:06 | 只看该作者
1.你的数据三列各代表什么?
2.你的程序运行后有何问题?

17

帖子

4

主题

0

精华

入门

F 币
80 元
贡献
50 点
板凳
 楼主| 发表于 2014-4-30 05:02:46 | 只看该作者
chuxf 发表于 2014-4-29 13:44
1.你的数据三列各代表什么?
2.你的程序运行后有何问题?

分别是x轴坐标,y轴坐标,时间。运行后直接错误然后退出。。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 2014-4-30 08:07:34 | 只看该作者
lz先把两个do循环的次数从100变到10再看看吧

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

5#
发表于 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


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

17

帖子

4

主题

0

精华

入门

F 币
80 元
贡献
50 点
6#
 楼主| 发表于 2014-4-30 09:53:56 | 只看该作者
fcode 发表于 2014-4-30 08:42
文件结束的情况你没判断吧?

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

我想要的是一个s的值,S是所有距离平方的和,比如如果要找最接近0.02秒间隔的和,就是找出最接近0.02,0.04,0.06,0.08,0.1....这些时间的位置,然后用0.02秒x轴的的位置减去0时间x轴的位置的平方,加上0.02秒y轴的的位置减去0时间y轴的位置的平方,就是每一个l, 0.04和0.02的位移平方又是一个l,类推,所有这些l的和就是s,我想得到的就是这个s,我不知道我的逻辑对不对,好像有点问题又不知道哪里有问题

17

帖子

4

主题

0

精华

入门

F 币
80 元
贡献
50 点
7#
 楼主| 发表于 2014-4-30 09:54:40 | 只看该作者
pasuka 发表于 2014-4-30 08:07
lz先把两个do循环的次数从100变到10再看看吧

试过了,还是不对

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

8#
发表于 2014-4-30 15:14:19 | 只看该作者
对不起,理解不了。建议你仅以一个数据来距离说明。不要一会 0.02,一会0.04,一会0.08 的

17

帖子

4

主题

0

精华

入门

F 币
80 元
贡献
50 点
9#
 楼主| 发表于 2014-5-1 05:38:20 | 只看该作者
fcode 发表于 2014-4-30 15:14
对不起,理解不了。建议你仅以一个数据来距离说明。不要一会 0.02,一会0.04,一会0.08 的 ...

10.00000       10.00000      0.0000000E+00
   9.560000       12.60000      4.0826998E-03
   6.560000       10.72000      5.7680998E-03
   8.000000       10.80000      9.9683004E-03
   9.880000       9.800000      1.1211000E-02
   8.880000       10.80000      1.4416700E-02
   9.360000       11.44000      1.6414599E-02
   7.480000       11.40000      1.8196600E-02
   8.600000       10.44000      2.1517800E-02
就比如以上数据,红字是我想要找出来的数据,时间间隔是0.01秒,就是最接近0.01,0.02的值,然后可以得到0.01秒,0.02秒时间的x,y轴坐标,比如 t=0 就是 (10,10),t=0.01时是(8,10.8), t=0.02时是(8.6,10.44),然后我相求的就是每一个时间的位移的平方和,比如0到0.01是(10-8)*(10-8)+(10-10.8)*(10-10.8),0.01到0.02时就是(8.6-8)*(8.6-8)+(10.44-10.8)*(10.44-10.8),以此类推,0.02到0.03,0.03到0.04。。。。我就想求这些所有的位移的平方和的和,就是 (10-8)*(10-8)+(10-10.8)*(10-10.8)+(8.6-8)*(8.6-8)+(10.44-10.8)*(10.44-10.8)+............

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

10#
发表于 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
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 10:10

Powered by Tencent X3.4

© 2013-2024 Tencent

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