4. 描述函数的计算:傅里叶级数展开法、谐波线性化法、描述函数的推导步骤
好,咱们今天聊聊描述函数到底怎么算。说实话,我刚入行那会儿,看到一堆傅里叶级数就头大。后来做项目做多了才发现,这东西说白了就是个「等效增益」的概念——把非线性环节在正弦输入下的输出,用基波分量近似一下。
4.1 核心思想:为什么要用傅里叶级数?
你想想看,一个非线性环节,你给它一个正弦信号 x(t) = A sin(ωt),它的输出 y(t) 肯定不是正弦波了。可能是方波、三角波,或者奇奇怪怪的形状。
但问题是,我们做系统分析时,最熟悉的就是线性系统的频率响应。那怎么办?
嗯,这里有个关键假设:非线性环节的输出中,高次谐波会被线性部分的低通滤波特性衰减掉。所以,我们只关心基波分量就够了。
描述函数的本质: 非线性环节在正弦输入下的「等效复增益」。它把非线性特性近似成一个与输入幅值 A 和频率 ω 有关的复数函数 N(A, ω)。
4.2 傅里叶级数展开法
这个方法最直接,也最「暴力」。我在项目中遇到过一个带死区的继电器特性,就是用这个方法硬算出来的。
具体步骤是这样的:
- 给输入:设
x(t) = A sin(ωt) - 求输出:根据非线性特性,写出
y(t)的表达式 - 展开傅里叶级数:
y(t) = a₀/2 + Σ[aₙ cos(nωt) + bₙ sin(nωt)]
其中:
a₀ = (1/π) ∫₀²ᵖⁱ y(t) d(ωt) // 直流分量
aₙ = (1/π) ∫₀²ᵖⁱ y(t) cos(nωt) d(ωt)
bₙ = (1/π) ∫₀²ᵖⁱ y(t) sin(nωt) d(ωt)
- 提取基波:只取 n=1 的项
y₁(t) = a₁ cos(ωt) + b₁ sin(ωt)
- 写出描述函数:
N(A, ω) = (b₁ + j a₁) / A
我的经验: 实际计算时,很多非线性特性是奇函数(比如死区、饱和、继电器),这时候 aₙ = 0,只算 bₙ 就行。能省一半功夫。
4.3 谐波线性化法
这个方法更「工程化」。说白了,就是直接找输出基波和输入之间的等效关系。
我曾经在一个电机控制项目里用过这个方法。当时要分析带摩擦非线性的系统,用傅里叶级数展开太麻烦,谐波线性化法就快多了。
步骤是这样的:
- 写出输出表达式:y(t) = f(A sin(ωt))
- 直接求基波分量:
Y₁ = (1/π) ∫₀²ᵖⁱ f(A sin θ) sin θ dθ // 同相分量
Y₂ = (1/π) ∫₀²ᵖⁱ f(A sin θ) cos θ dθ // 正交分量
其中 θ = ωt
- 描述函数:
N(A) = (Y₁ + jY₂) / A
注意: 如果非线性特性是单值函数(输出只取决于当前输入值),那么 Y₂ = 0,描述函数是实数。如果是多值函数(比如滞环),Y₂ ≠ 0,描述函数就是复数,代表有相位滞后。
4.4 典型非线性特性的描述函数推导
咱们拿最常见的几个例子过一遍。我建议你记住这些结果,项目里经常用到。
4.4.1 理想继电器特性
特性:当 x > 0 时 y = M,当 x < 0 时 y = -M
输入 x = A sin(ωt),输出是幅值为 M 的方波。
计算基波:
b₁ = (1/π) ∫₀²ᵖⁱ y(t) sin(ωt) d(ωt)
= (1/π) [∫₀ᵖⁱ M sinθ dθ + ∫ₚⁱ²ᵖⁱ (-M) sinθ dθ]
= (4M)/π
所以:
N(A) = b₁ / A = 4M / (πA)
关键点: 理想继电器的描述函数与频率无关,只与输入幅值 A 成反比。A 越大,等效增益越小。
4.4.2 饱和特性
特性:当 |x| ≤ s 时 y = kx,当 |x| > s 时 y = k·s·sign(x)
这个计算稍微复杂一点。我直接给结果:
当 A ≤ s 时:N(A) = k
当 A > s 时:N(A) = (2k/π)[arcsin(s/A) + (s/A)√(1 - (s/A)²)]
你看,当输入幅值小于饱和区时,它就是线性的。一旦进入饱和区,等效增益就开始下降。
4.4.3 死区特性
特性:当 |x| ≤ Δ 时 y = 0,当 |x| > Δ 时 y = k(x - Δ·sign(x))
结果:
当 A ≤ Δ 时:N(A) = 0
当 A > Δ 时:N(A) = k - (2k/π)[arcsin(Δ/A) + (Δ/A)√(1 - (Δ/A)²)]
避坑指南: 我曾经在一个液压伺服系统里,死区没算准,结果系统低频振荡。后来发现死区描述函数在 A 略大于 Δ 时增益很小,导致系统相位裕度不足。所以,死区一定要考虑输入幅值范围。
4.5 描述函数的推导步骤总结
我把整个流程整理成了一张图,方便你对照着用:
4.6 实际项目中的注意事项
讲完了理论,我跟你分享几个实战经验:
- 对称性检查:先看非线性特性是不是奇对称。如果是,直流分量 a₀ = 0,正交分量 a₁ = 0,计算量减半。
- 分段积分:遇到分段非线性(比如死区+饱和),别怕麻烦,老老实实分段积分。我见过有人偷懒用近似公式,结果分析结果差了一倍。
- 数值验证:推导完解析表达式后,用 MATLAB 做个数值仿真验证一下。取几个不同的 A 值,对比理论值和仿真值。
- 频率依赖性:大多数静态非线性(死区、饱和、继电器)的描述函数与频率无关。但动态非线性(比如滞环、摩擦)就与频率有关了,要注意。
重要提醒: 描述函数法只适用于「非线性程度不太严重」的系统。如果非线性太强,高次谐波不能被充分衰减,这个方法就会失效。我曾在某个功率放大器项目中吃过这个亏,后来改用 describing function 结合 describing function 才搞定。
好了,描述函数的计算就讲到这里。记住,核心就是三步:给正弦输入、求输出基波、算等效增益。多练几个典型例子,你就能找到感觉了。
公众号:蓝海资料掘金营,微信deep3321