我有一组数据放在 data.txt中,如下所示,共5行。第1列数据代表时刻,单位是秒。这列数据并不规则,它们并不等差,存储在 Time(:) 数组中。第二列数据是对应时刻的流量值,存储在 Inflow(:) 数组中。-------------
0 10
1 15
3 20
4 22
5 15
-------------
下面贴出代码。代码并不完整,只是插值的核心部分。代码中的CurTime是由其它子程序计算得到,它也是由0.0开始,逐渐增加,但每次增加的大小并不确定,会变化。下面代码中没有写出CurTime的变化,大家可以把它当成一个已知的值。下面代码就想线性插值得到 CurTime 这 个时刻的 Inflow 值。CurTime在不断变大,每变一次,都要用下面这个代码插值一次得到新的Inflow。
感觉下面自己的这个算法有点笨,算法每次都要从data.txt中的第1行开始读,并找到Curtime位于哪两个Time之间,然后做线性插值。感觉这样的效率有点低。因为随着CurTime的增大,它需要用到的两行插值数据,越来越在data.txt的后面,但算法还是要逐个比较 data.txt 前面的数据,有点浪费时间。因为上面的data.txt只是我举的一个例子,仅为了示意。实际程序中这个data.txt有数百行,乃至千行。自己也没有找到更好的方法,大家有没有好的优化建议。欢迎指教。
[Fortran] 纯文本查看 复制代码 program main
implicit none
integer :: Time(5), Inflow(5)
integer :: j
real :: CurTime, InflowNow
Time = (/ 0, 1, 3, 4, 8 /)
Inflow = (/ 10, 15, 20, 22, 15 /)
Do j = 1, 5
IF(CurTime == Time(j)) Then
InflowNow = Inflow(j)
Exit
Else IF(CurTime < Time(j)) Then
InflowNow = Inflow(j-1) + (CurTime - Time(j-1))*(Inflow(j) - Inflow(j-1)) / (Time(j) - Time(j-1))
Exit
End IF
End Do
end
|