利用Python解决离散时间表内近似对齐整周期时间点查找问题

假设运动解算时间是离散的,具有最小间隔dt,而控制周期为T,T>dt,两者可能相差一个整数,也可能相差一个分数或者无理数。

需要在循环的过程中找出控制可以介入的时间点,需要求t0+m*dt≈t0+n*T从而确保控制量能在近似于周期的整数倍的dt的整数倍时间点进入运动解算过程。

设T=n*dt,即使n为整数,由于浮点数误差存在,也无法直接使用t/dt是否为整数来判断。

以下代码至少可以保证求出来的近似对齐时间点在求出时间点个数和最大最小值上是正确的,不论n是整数、分数还是无理数。如果有知道详细原理的欢迎交流讨论。

from math import pi
dt=0.03131313131556497
t=0

n=pi
total_dots=14337 # 总共点数

T=dt*n # 周期

t_list=[]
list1=[]

for i in range(total_dots):
    t+=dt
    t_list.append(round(t,5))

    '组合动作start'
    j=t/T
    k=j-round(j)
    print(k)
    if abs(k)<0.5/n: # 0.001:
        list1.append(t)
    '组合动作end'

    if (i+1)%n==0:
        print('整n',t,'\n')

print('应该找出的点数', int(total_dots/n))

最后算出:应该找出的点数为4563

t_list一共是14337个值,最小0.03131,最大448393636 

list1一共是4563个值,最小0.09393939....,最大448.873737....

如果正常一点,设dt=0.01,n=10,计算的结果也是正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值