每隔不同时间段的位移量平方的总和--问题
我想下面数据的每隔不同时间段的位移量平方的总和,例如每隔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
1.你的数据三列各代表什么?
2.你的程序运行后有何问题? chuxf 发表于 2014-4-29 13:44
1.你的数据三列各代表什么?
2.你的程序运行后有何问题?
分别是x轴坐标,y轴坐标,时间。运行后直接错误然后退出。。 lz先把两个do循环的次数从100变到10再看看吧 文件结束的情况你没判断吧?
根据你的数据,我把 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
除了最后文件读到结束以后弹错,前面还是有计算结果的。不知道是否是你想要的? 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,我不知道我的逻辑对不对,好像有点问题又不知道哪里有问题 pasuka 发表于 2014-4-30 08:07
lz先把两个do循环的次数从100变到10再看看吧
试过了,还是不对 对不起,理解不了。建议你仅以一个数据来距离说明。不要一会 0.02,一会0.04,一会0.08 的 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)+............ 描述一个需求,是一个费力的事情。
关于你的需求,大概懂了你的意思,但还有几个问题不敢确定。再问就不好意思了,我做一些假定吧。
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