新手求指点 发表于 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


程序
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

楚香饭 发表于 2014-4-29 13:44:06

1.你的数据三列各代表什么?
2.你的程序运行后有何问题?

新手求指点 发表于 2014-4-30 05:02:46

chuxf 发表于 2014-4-29 13:44
1.你的数据三列各代表什么?
2.你的程序运行后有何问题?

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

pasuka 发表于 2014-4-30 08:07:34

lz先把两个do循环的次数从100变到10再看看吧

fcode 发表于 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

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

新手求指点 发表于 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,我不知道我的逻辑对不对,好像有点问题又不知道哪里有问题

新手求指点 发表于 2014-4-30 09:54:40

pasuka 发表于 2014-4-30 08:07
lz先把两个do循环的次数从100变到10再看看吧

试过了,还是不对

fcode 发表于 2014-4-30 15:14:19

对不起,理解不了。建议你仅以一个数据来距离说明。不要一会 0.02,一会0.04,一会0.08 的

新手求指点 发表于 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)+............

fcode 发表于 2014-5-1 08:07:07

描述一个需求,是一个费力的事情。

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

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

下面是在这三个假设上写的代码,如果上面的假设不成立。则程序需要更复杂一点。
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
页: [1] 2
查看完整版本: 每隔不同时间段的位移量平方的总和--问题