Twiddle算法的简单Demo

1.简单说明

Twiddle算法可以为一个计算误差的算法A去找到一个好的参数P。比如在PID调参中,一次调整一个参数,最终生成最优参数集,实现最优参数的搜索。

相较于梯度下降之类的算法的话,最大的优点就应该是简单了吧,不用去计算高维函数的梯度。

Talk is cheap, show me the code!

2.代码说明

下面写一段伪Python代码来说明一下,在这里的话以PID为例。

# 我们为PID算法选取初始化参数构成参数向量p,顺序依次为拍P->I->D
# 因为这也符合PID整定的一般规则,先比例,后积分,再微分。
p = [0, 0, 0]
# 在这里我们定义初始的变化量
dp = [1, 1, 1]
# 这里的A(p)是计算误差的算法
best_err = A(p)

# 我们将误差的阈值设置为0.1,
threshold = 0.1

#如果dp的变化量和比我们设置的阈值大的话,执行循环操作
while sum(dp) > threshold:
    for i in range(len(p)):
        p[i] += dp[i]
        err = A(p)

        if err < best_err:  # 误差比目前最好的误差更小则更新最好误差值
            best_err = err
            dp[i] *= 1.1
        else:  # 不然的话我们就将目前的参数朝另一个方向进行计算(这里减去2倍是因为刚才加了1次)
            p[i] -= 2 * dp[i]  
            err = A(p)

            if err < best_err:  # 误差变优的话则更新
                best_err = err
                dp[i] *= 1.05
            else:  # 不然的话就说明目前的变化值设计的太大,既不能There was no improvement
                p[i] += dp[i] # 这一步是为了让p[i]返回到这次循环前的值,即不加不减
                dp[i] *= 0.95 # 减小变化值继续反复更新参数
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFT(快速傅里叶变换)是一种高效的算法,用于计算离散傅里叶变换(DFT)。DFT是一种将时域信号转换为频域信号的方法,它在信号处理和频谱分析中广泛应用。 FFT算法的基本原理是利用了DFT的对称性和周期性质,将复杂度为O(n^2)的DFT计算转换为复杂度为O(nlogn)的计算。FFT算法采用了分治策略,将长度为N的DFT分解为两个长度为N/2的DFT,并通过递归的方式进行计算。 具体来说,FFT算法的基本步骤如下: 1. 将输入序列分成偶数和奇数索引两部分。 2. 对偶数索引部分进行FFT计算,得到偶数部分的频域表示。 3. 对奇数索引部分进行FFT计算,得到奇数部分的频域表示。 4. 将偶数部分和奇数部分的频域表示合并,得到最终的频域表示。 在每一级递归中,FFT算法通过利用旋转因子(Twiddle factor)来实现频域合并。旋转因子是一个复数,它可以将两个频域值相乘并得到新的频域值。 通过不断地递归分解和合并,FFT算法可以在O(nlogn)的时间复杂度内完成DFT的计算。这使得FFT算法成为了处理大规模信号和频谱分析的常用工具。 需要注意的是,FFT算法要求输入序列的长度为2的幂次方,因此在实际应用中可能需要对输入序列进行补零或截断操作。同时,由于FFT算法的计算过程中存在一定的误差累积,可能会引入一些频谱泄漏和谐波干扰等问题,在实际应用中需要进行适当的处理和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值