在 MATLAB 中使用最小二乘法估计电机参数的问题

计算科学 计算物理学 软件 最小二乘 数据分析
2021-12-27 05:33:55

基本上,我正在尝试使用最小二乘法来估计直流电机的参数。

我的系统可以通过以下矩阵方程建模:

[Vinput(t)0]=[didt(t)I(t)ω(t)0000I(t)dωdt(t)ω(t)]×[LRktJB]

据我了解(诚然可能还不够),我可以估计向量的常数是什么[L,R,kt,J,B]T如果我碰巧知道少数数据点的时间相关变量的值。如果我把方程的形式Y=M×K,那么在特定离散时刻的最小二乘估计应该由下式给出K^=(MTM)1MTY.

我有一个电机设置为由正弦电压信号驱动,偏移以使电流不会反转(为简单起见)。我测量了角速率、施加的电压和施加的电流。为了从噪声信号中获得必要的导数,我在 MATLAB 中构建了一个正弦拟合脚本,它可以最小化所有测量数据点的拟合信号和噪声信号之间的平均绝对差。我不是统计学家,但最终的拟合结果被认为是“好的”,所以我继续前进。

角速率信号

更大的版本

对每个测量参数使用平滑拟合曲线,我计算了必要的导数并将所有内容插入 MATLAB。(我知道 K = inv(M.'*M)*(M.'*Y) 并不是对计算最友好的,但我需要坚持我在文章中列出的实验程序。 )

拟合曲线和导数

更大的版本

我的输出[L,R,kt,J,B]T虽然绝对是垃圾,但 MATLAB 吐出的值似乎都不合理。有大得离谱的值,非常小的值,还有很多负值。(物理性质不应该是负数。)

糟糕的参数估计

更大的版本

我本来打算估计[L,R,kt,J,B]T对于我的每个数据向量,然后平均这些结果,但是当我的结果已经无用时,我显然不会得到任何有意义的东西。

这里有人会碰巧知道我可能出错的地方吗?

我一直盯着我的代码,直到我没有取得太大进展而交叉眼睛,所以我怀疑这可能是“垃圾输入导致垃圾输出”的情况。我对正在发生的事情的稍微受过教育的猜测是:

  1. 我忽略了数学中一些基本的东西。
  2. 某处存在数据不匹配。
  3. 我会迷失在浮点错误中。(符号 MATLAB 表示MTM0,但我知道人们经常使用这种数学。因此,我只能得出这样的结论:计算有效,但对测量值或其他东西的变化非常敏感。)

有人有想法吗?

(如果您正在寻找一个特定的问题,“我所描述的数学在什么实验条件下可以工作? ”怎么样?)

1个回答

我想我明白你做了什么,即使没有进一步的解释。在每个时间步ti您正在以最小二乘的方式求解以下形式的方程组Y(ti)=M(ti)K, 和M(ti)R2×5,分别得到一个与时间无关的向量的估计KR5,然后您希望以某种方式合并估计值。

不幸的是,这是行不通的,因为正如评论中所指出的那样,这些方程组被低估了,因此每个都有无限数量的解;LS 公式只得到其中一个(每个系统都有一个不同的)。

相反,您需要做的是在 LS 意义上求解通过组合所有方程得到的完整方程组:

Y=MK,Y=[Y(t1)Y(t2)Y(tn)],M=[M(t1)M(t2)M(tn)].

这会给你一个单一的估计K在合适的模型下最小化总误差。矩阵M通常具有完整的列排名,因此与以前的问题不同,这个问题应该是适定的。(但这不是使用像 . 这样的坏数字的正当借口inv(M'*M)。)

所以答案是 1。你忽略了数学中的一些基本问题。如果您希望能够理解这种估计,您需要熟悉最小二乘的数学。