【翻译】战术与战略导弹制导导论-第1章-数值计算技术

第1章 数值计算技术

简介

本章介绍的数值技术主要包括:用于处理和表达微分方程的拉普拉斯变换(Laplace transforms),以及用于求解微分方程的数值积分法。这些技术构成了本书所使用的所有数值方法的基础。我们将通过一个数值示例,展示拉普拉斯变换和数值积分的实际应用。另一个示例将演示如何利用 zzz 变换(zzz transforms)来表示差分方程并求得其解。此外,我们将引入状态空间(State-space)表示法,作为描述微分方程的一种简便记号。最后,我们将介绍计算基础矩阵(Fundamental Matrix)的方法。基础矩阵对于卡尔曼滤波(Kalman filtering)和高级制导律的开发都是必不可少的。

拉普拉斯变换与微分方程

变换方法之所以有用,是因为在通过变换后的域(domain)中,某些运算会变得不同,且往往比原域中的运算更为简单。例如,时域中的常微分方程在经过拉普拉斯变换后,会变成 sss 域中的代数表达式。在控制系统工程中,拉普拉斯变换既被用作一种简便的记号,也被用作求解线性微分方程的一种方法。在本书中,我们将频繁使用拉普拉斯变换符号来表示战术导弹制导系统中的子系统动力学。

如果我们定义 F(s)F(s)F(s) 为 f(t)f(t)f(t) 的拉普拉斯变换,那么拉普拉斯变换的定义如下:

F(s)=∫0∞f(t)e−stdt F (s) = \int_ {0} ^ {\infty} f (t) e ^ {- s t} d t F(s)=∫0∞f(t)e−stdt

根据这个定义,很容易证明:时域中的求和运算在拉普拉斯变换域(或频域)中也是求和运算。例如,如果 f1(t)f_1(t)f1(t) 和 f2(t)f_2(t)f2(t) 的拉普拉斯变换分别为 F1(s)F_1(s)F1(s) 和 F2(s)F_2(s)F2(s),那么:

L[f1(t)±f2(t)]=F1(s)±F2(s) \mathcal {L} \left[ f _ {1} (t) \pm f _ {2} (t) \right] = F _ {1} (s) \pm F _ {2} (s) L[f1(t)±f2(t)]=F1(s)±F2(s)

同样,利用拉普拉斯变换的定义,很容易证明:时域中的微分运算等价于拉普拉斯变换域中的频率乘法,即:

L(df(t)dt)=sF(s)−f(0) \mathcal {L} \left(\frac {\mathrm {d} f (t)}{\mathrm {d} t}\right) = s F (s) - f (0) L(dtdf(t))=sF(s)−f(0)

其中 f(0)f(0)f(0) 是 f(t)f(t)f(t) 的初始条件。函数 nnn 阶导数的拉普拉斯变换为:

L(dnf(t)dtn)=snF(s)−sn−1f(0)−sn−2df(0)dt−... \mathcal {L} \left(\frac {\mathrm {d} ^ {n} f (t)}{\mathrm {d} t ^ {n}}\right) = s ^ {n} F (s) - s ^ {n - 1} f (0) - s ^ {n - 2} \frac {\mathrm {d} f (0)}{\mathrm {d} t} - \dots L(dtndnf(t))=snF(s)−sn−1f(0)−sn−2dtdf(0)−...

从上式可以看出,在零初始条件下,时域中的 nnn 阶导数等价于拉普拉斯变换域中乘以 sns^nsn。

拉普拉斯变换还可以用来将微分方程的输入-输出关系转换为一种称为传递函数(Transfer Function)表示法的简便记号。例如,给定如下二阶方程:

d2y(t)dt2+2dy(t)dt+4y(t)=x(t) \frac {\mathrm {d} ^ {2} y (t)}{\mathrm {d} t ^ {2}} + 2 \frac {\mathrm {d} y (t)}{\mathrm {d} t} + 4 y (t) = x (t) dt2d2y(t)+2dtdy(t)+4y(t)=x(t)

且初始条件为零,即:

dy(0)dt=0,y(0)=0 \frac {\mathrm {d} y (0)}{\mathrm {d} t} = 0, \quad y (0) = 0 dtdy(0)=0,y(0)=0

我们可以求得该微分方程在拉普拉斯变换域中的形式为:

s2Y(s)+2sY(s)+4Y(s)=X(s) s ^ {2} Y (s) + 2 s Y (s) + 4 Y (s) = X (s) s2Y(s)+2sY(s)+4Y(s)=X(s)

合并上式中的同类项,得到输出与输入之间的分式关系,即传递函数:

Y(s)X(s)=1s2+2s+4 \frac {Y (s)}{X (s)} = \frac {1}{s ^ {2} + 2 s + 4} X(s)Y(s)=s2+2s+41

同样地,给定一个传递函数,我们可以还原回微分方程的形式。考虑如下二阶传递函数:

Y(s)X(s)=1+2s1+2s+s2 \frac {Y (s)}{X (s)} = \frac {1 + 2 s}{1 + 2 s + s ^ {2}} X(s)Y(s)=1+2s+s21+2s

我们知道,根据链式法则,该传递函数可以表示为:

Y(s)X(s)=E(s)X(s)Y(s)E(s) \frac {Y (s)}{X (s)} = \frac {E (s)}{X (s)} \frac {Y (s)}{E (s)} X(s)Y(s)=X(s)E(s)E(s)Y(s)

因此,我们可以将该关系分解为以下两个等效的传递函数:

E(s)X(s)=11+2s+s2,Y(s)E(s)=1+2s \frac {E (s)}{X (s)} = \frac {1}{1 + 2 s + s ^ {2}}, \quad \frac {Y (s)}{E (s)} = 1 + 2 s X(s)E(s)=1+2s+s21,E(s)Y(s)=1+2s

交叉相乘可得:

s2E(s)+2sE(s)+E(s)=X(s) s ^ {2} E (s) + 2 s E (s) + E (s) = X (s) s2E(s)+2sE(s)+E(s)=X(s)

以及

2sE(s)+E(s)=Y(s) 2 s E (s) + E (s) = Y (s) 2sE(s)+E(s)=Y(s)

将第一个方程转换回时域,得到二阶微分方程:

d2e(t)dt2+2de(t)dt+e(t)=x(t) \frac {\mathrm {d} ^ {2} e (t)}{\mathrm {d} t ^ {2}} + 2 \frac {\mathrm {d} e (t)}{\mathrm {d} t} + e (t) = x (t) dt2d2e(t)+2dtde(t)+e(t)=x(t)

将第二个方程转换回时域,得到输出关系:

y(t)=2de(t)dt+e(t) y (t) = 2 \frac {\mathrm {d} e (t)}{\mathrm {d} t} + e (t) y(t)=2dtde(t)+e(t)

传递函数表示法的隐含前提是二阶微分方程的初始条件为零,即:

de(0)dt=0,e(0)=0 \frac {\mathrm {d} e (0)}{\mathrm {d} t} = 0, \qquad e (0) = 0 dtde(0)=0,e(0)=0

我们通常会使用拉普拉斯变换符号,并且为了简便起见,在符号中省略对 sss 的函数依赖性 [即 FFF 等同于 F(s)F(s)F(s)]。同样,在时域中,我们也常省略对 ttt 的函数依赖性 [即 fff 等同于 f(t)f(t)f(t)]。此外,框图和程序清单中经常使用上点(overdot)符号来表示时间导数。在这种表示法中,每个上点代表一次求导。例如:

y˙=dydt,y¨=d2ydt2,y...=d3ydt3,等 \dot {\mathrm {y}} = \frac {\mathrm {d} y}{\mathrm {d} t}, \quad \ddot {\mathrm {y}} = \frac {\mathrm {d} ^ {2} y}{\mathrm {d} t ^ {2}}, \quad \dddot {\mathrm {y}} = \frac {\mathrm {d} ^ {3} y}{\mathrm {d} t ^ {3}}, \quad \text {等} y˙=dtdy,y¨=dt2d2y,y...=dt3d3y,等

因此,将

d2e(t)dt2+2de(t)dt+e(t)=x(t) \frac {\mathrm {d} ^ {2} e (t)}{\mathrm {d} t ^ {2}} + 2 \frac {\mathrm {d} e (t)}{\mathrm {d} t} + e (t) = x (t) dt2d2e(t)+2dtde(t)+e(t)=x(t)

转换为上点表示法,得到:

e¨+2e˙+e=x \ddot {e} + 2 \dot {e} + e = x e¨+2e˙+e=x

表 1.1 常用拉普拉斯逆变换

F(s) f(t)
K/sK/sK/s KKK
K/sn(n=1,2,... )K/s^n \quad (n = 1, 2, \dots)K/sn(n=1,2,...) Ktn−1/(n−1)!Kt^{n-1} / (n-1)!Ktn−1/(n−1)!
K/(s−a)n(n=1,2,... )K/(s-a)^n \quad (n = 1, 2, \dots)K/(s−a)n(n=1,2,...) Ktn−1eat/(n−1)!Kt^{n-1}e^{at} / (n-1)!Ktn−1eat/(n−1)!
K/(s2+a2)K/(s^2 + a^2)K/(s2+a2) Ksin⁡(at)/aK \sin(at)/aKsin(at)/a
Ks/(s2+a2)Ks/(s^2 + a^2)Ks/(s2+a2) Kcos⁡(at)K \cos(at)Kcos(at)
K/((s−a)2+b2)K/((s-a)^2 + b^2)K/((s−a)2+b2) Keatsin⁡(bt)/bKe^{at} \sin(bt)/bKeatsin(bt)/b
K(s−a)/((s−a)2+b2)K(s-a)/((s-a)^2 + b^2)K(s−a)/((s−a)2+b2) Keatcos⁡(bt)Ke^{at} \cos(bt)Keatcos(bt)

有时,我们可以通过观察直接将时间函数转换为拉普拉斯变换,反之亦然。表 1.1 列出了一些常用的传递函数 [1] 及其对应的时域形式。更详细的拉普拉斯逆变换列表可以在文献 [1] 中找到。

微分方程的数值积分 [2]

在本书中,我们将模拟线性及非线性常微分方程。由于这些方程通常没有解析解(closed-form solutions),因此必须借助数值积分技术来求解或模拟这些方程。用于求解微分方程的数值积分技术有很多种。让我们从最简单的------欧拉(Euler)[3] 积分法开始。

欧拉积分法 (Euler Integration)

欧拉积分法是一种数值积分技术,适用于本书中的大多数示例。考虑如下形式的一阶微分方程:

x˙=f(x,t) \dot {\boldsymbol {x}} = f (\boldsymbol {x}, t) x˙=f(x,t)

根据微积分知识,函数的导数定义可以近似为:

x˙=f(x,t)=x(t+h)−x(t)h=xk−xk−1h \dot {\boldsymbol {x}} = f (\boldsymbol {x}, t) = \frac {\boldsymbol {x} (t + h) - \boldsymbol {x} (t)}{h} = \frac {\boldsymbol {x} _ {k} - \boldsymbol {x} _ {k - 1}}{h} x˙=f(x,t)=hx(t+h)−x(t)=hxk−xk−1

其中 hhh 是一个很小的积分步长。重新排列各项可得:

xk=xk−1+hf(x,t) \boldsymbol {x} _ {k} = \boldsymbol {x} _ {k - 1} + h f (\boldsymbol {x}, t) xk=xk−1+hf(x,t)

上式即为欧拉积分公式。利用欧拉积分,下一个积分时刻 hhh 的状态值 x\boldsymbol{x}x 等于前一时刻的 x\boldsymbol{x}x 值加上一个与 ttt 时刻导数成正比的项。在每次递归中,时间增加一个积分步长 hhh。为了开始数值积分过程,我们需要 x\boldsymbol{x}x 的初始值。该值来源于微分方程所需的初始条件。

我们在微积分中学过,对函数积分相当于求该函数曲线下的面积。欧拉积分是计算由 f(x,t)f(\boldsymbol{x}, t)f(x,t) 表示的曲线下面积的最简单近似方法。它代表了高度为 f(x,t)f(\boldsymbol{x}, t)f(x,t)、宽度为 hhh 的小矩形面积之和,如图 1.1 所示。当然,使用小矩形来近似曲线会产生积分误差,但可以通过减小每个矩形的宽度来减小这些误差。减小矩形的宽度相当于减小积分步长。

积分步长 hhh 必须足够小,以产生足够精度的答案。工程师之间通常采用的一种简单测试方法是通过实验找到合适的积分步长。根据经验法则,初始步长通常选择为比所考虑系统中最小时间常数小几倍的值。然后将步长减半,看答案是否发生显著变化。如果新答案大致相同,则使用较大的积分步长以避免过多的计算机运行时间。如果答案发生大幅变化,则再次将积分区间减半,并重复该过程。

图 1.1: 使用矩形求曲线下面积等效于欧拉积分。

为了了解如何使用欧拉积分技术求解微分方程,让我们构造一个已知解的问题。如果微分方程(假设我们还没构造出微分方程)关于 xxx 的解是正弦函数:

x=sin⁡ωt x = \sin \omega t x=sinωt

对其求导一次得到:

x˙=ωcos⁡ωt \dot {x} = \omega \cos \omega t x˙=ωcosωt

再次求导得到:

x¨=−ω2sin⁡ωt \ddot {x} = - \omega^ {2} \sin \omega t x¨=−ω2sinωt

注意到最后一个方程可以用第一个方程表示,我们得到:

x¨=−ω2x \ddot {x} = - \omega^ {2} x x¨=−ω2x

这是一个线性二阶微分方程。该微分方程的初始条件可以通过将时间设为零代入前两个方程(即 xxx 及其导数)获得,得到:

x(0)=0x˙(0)=ω \begin{array}{l} x (0) = 0 \\ \dot {x} (0) = \omega \\ \end{array} x(0)=0x˙(0)=ω

同样,我们预先知道具有上述两个初始条件的二阶线性微分方程的解就是:

x=sin⁡ωt x = \sin \omega t x=sinωt

让我们看看通过数值积分是否也能获得正确的解。

为了验证上述 xxx 的理论解析解,编写了一个包含数值积分的仿真程序。使用欧拉数值积分技术对二阶微分方程进行的仿真如清单 1.1 所示。首先给出了二阶微分方程。我们求解 xxx 的一阶导数,然后再求解 xxx。时间随积分步长 hhh 递增,我们重复此过程直到时间大于 10 秒。我们每隔 0.1 秒打印出 xxx 的理论值和仿真值(即通过欧拉积分获得的值)。

清单 1.1 使用欧拉数值积分仿真二阶微分方程

matlab 复制代码
clear all
close all
count = 0;
W=2;
T=0;
S=0;
X=0;
XD=W;
H=.01;
while T<=10
    S=S+H;
    XDD=-W*W*X;
    XD=XD+H*XDD;
    X=X+H*XD;
    T=T+H;
    if S>=.09999
        S=0;
        XTHEORY = sin(W*T);
        count = count+1;
        ArrayT(count)=T;
        ArrayX(count)=X;
        ArrayXTHEORY(count) = XTHEORY;
    end
end
figure
plot(ArrayT,ArrayX,ArrayT,ArrayXTHEORY),grid
xlabel('Time (Sec)')
ylabel('X & XTHEORY')
axis([0 10 -2 2])
clc
output=[ArrayT',ArrayX',ArrayXTHEORY'];
save datfil.txt output -ascii
disp 'simulation finished'

运行了清单 1.1 的标称情况,结果如图 1.2 所示。我们可以看到,对于所选的积分步长(即 H=0.01H = 0.01H=0.01),欧拉数值积分技术准确地积分了二阶微分方程,因为精确解和数值解是一致的。如前所述,由于我们通常没有精确解,因此我们通常通过实验来确定要使用的正确积分区间。

有时,对于给定的积分区间,使用欧拉积分的代价是精度低于其他数值积分方法。

谨慎行事并使用较小的积分步长是利用欧拉积分获得准确答案的一种方法。然而,有时无论积分步长多小,欧拉积分都根本不起作用。基于这个原因,我们现在将考虑更精确的二阶龙格-库塔(Runge--Kutta)[3] 数值积分技术。

龙格-库塔积分法 (Runge--Kutta Integration)

二阶龙格-库塔数值积分过程很容易陈述。给定如下形式的一阶微分方程:

x˙=f(x,t) \dot {\boldsymbol {x}} = f (\boldsymbol {x}, t) x˙=f(x,t)

其中 ttt 是时间,我们寻求找到 x\boldsymbol{x}x 随时间变化的递归关系。使用二阶龙格-库塔数值技术,下一个积分区间 hhh 的 x\boldsymbol{x}x 值由下式给出:

xk=xk−1+0.5h[f(x,t)+f(x,t+h)] \boldsymbol {x} _ {k} = \boldsymbol {x} _ {k - 1} + 0. 5 h [ f (\boldsymbol {x}, t) + f (\boldsymbol {x}, t + h) ] xk=xk−1+0.5h[f(x,t)+f(x,t+h)]

其中下标 k−1k - 1k−1 代表上一个区间,下标 kkk 代表新区间。从上式可以看出,x\boldsymbol{x}x 的新值仅仅是 x\boldsymbol{x}x 的旧值加上一个与 ttt 时刻评估的导数成正比的项,以及另一个与 t+ht + ht+h 时刻评估的导数成正比的项。为了开始积分,我们再次需要 x\boldsymbol{x}x 的初始值。如前所述,该值来源于微分方程所需的初始条件。

如果我们看图 1.3,我们可以看到二阶龙格-库塔数值积分也是一种求曲线下面积的方法;然而,我们使用小梯形而不是小矩形来近似曲线。因为梯形的面积是底乘以两高之和的一半,我们可以看到上述二阶龙格-库塔技术的积分公式实际上就是梯形积分。通过比较图 1.1 和图 1.3,我们可以看到梯形比矩形能更好地近似曲线下的面积。因此,对于给定的积分步长,二阶龙格-库塔方法将比欧拉积分更准确。

图 1.2: 欧拉数值技术准确地积分了二阶微分方程。

图 1.3: 使用梯形求曲线下面积等效于二阶龙格-库塔积分。

使用二阶龙格-库塔积分技术的仿真程序清单如清单 1.2 所示。从清单 1.2 中我们可以看到,微分方程或导数信息出现了两次(在原书中加粗显示)。我们在积分区间内评估两次微分方程:一次是在 ttt 时刻评估导数,另一次是在 t+ht + ht+h 时刻评估导数。从清单 1.2 中我们还可以看到,每隔 0.1 秒我们将微分方程的数值解 XXX 与解析解 XTHEORYXTHEORYXTHEORY 一起打印出来。在这个特定示例中,微分方程的固有频率 ω\omegaω 为 2 rad/s(即 W=2W = 2W=2)。

清单 1.2 使用二阶龙格-库塔数值积分仿真微分方程

matlab 复制代码
clear all
close all
count = 0;
W = 2;
T=0;
S=0;
X=0;
XD=W;
H=.01;
while T<=10
    S=S+H;
    XOLD=X;
    XDOLD = XD;
    XDD=-W*W*X;
    X=X+H*XD;
    XD=XD+H*XDD;
    T=T+H;

    % 第二次评估
    XDD=-W*W*X;
    X=.5*(XOLD+X+H*XD);
    XD=.5*(XDOLD+XD+H*XDD);

    if S>=.09999
        S=0;
        XTHEORY = sin(W*T);
        count = count+1;
        ArrayT(count)=T;
        ArrayX(count)=X;
        ArrayXTHEORY(count) = XTHEORY;
    end
end
figure
plot(ArrayT,ArrayX,ArrayT,ArrayXTHEORY),grid
xlabel('Time (Sec)')
ylabel('X & XTHEORY')
axis([0 10 -2 2])
clc
output=[ArrayT',ArrayX',ArrayXTHEORY'];
save datfil.txt output -ascii
disp 'simulation finished'

运行了清单 1.2 的标称情况,结果如图 1.4 所示。我们可以看到,对于所选的积分步长(即 H=0.01H = 0.01H=0.01),二阶龙格-库塔数值积分技术准确地积分了二阶微分方程,因为实际解和数值解是一致的。

我们在整本书中都将使用二阶龙格-库塔技术,因为它简单易懂、易于编程,最重要的是,对于本书中提出的所有示例都能得出准确的答案。因此,本书中随后的所有涉及数值积分的程序都将具有与清单 1.2 相同的结构。

图 1.4: 二阶龙格-库塔数值技术准确地积分了微分方程。

状态空间表示法 [2, 4]

在本书中,我们经常将线性微分方程置于状态空间(state-space)形式,因为这是设置卡尔曼滤波问题或推导高级制导律所必需的。使用状态空间表示法,我们是说任何一组线性微分方程都可以置于如下一阶矩阵微分方程的形式:

x˙=Fx+Gu+w \dot {x} = F x + G u + w x˙=Fx+Gu+w

其中 x\boldsymbol{x}x 称为系统状态向量,FFF 是系统动力学矩阵,uuu 是确定性输入(有时称为控制向量),w\boldsymbol{w}w 是随机强迫函数(也称为过程噪声)。

考虑一个如图 1.5 所示的低通滤波器示例。从图 1.5 中,我们可以写出输出与输入之间的传递函数为:

yx=11+sT {\frac {y}{x}} = {\frac {1}{1 + s T}} xy=1+sT1

交叉相乘并将拉普拉斯变换符号转换为时域,得到微分方程:

图 1.5: 低通滤波器示例。

y+y˙T=x y + \dot {y} T = x y+y˙T=x

求解最高阶导数后,我们得到:

y˙=(x−y)T \dot {y} = \frac {(x - y)}{T} y˙=T(x−y)

如果在这个例子中,输入 xxx 表示噪声,记为 nnn,则微分方程变为:

y˙=(n−y)T \dot {y} = \frac {(n - y)}{T} y˙=T(n−y)

其中 yyy 既表示系统的状态,也表示本例的输出,nnn 表示输入。如果将上述方程置于状态空间形式,则相应的矩阵均为标量,其值为:

F=−1T \boldsymbol {F} = - \frac {1}{T} F=−T1

G=0 G = 0 G=0

w=nT \boldsymbol {w} = \frac {n}{T} w=Tn

作为另一个例子,考虑没有任何随机输入的二阶微分方程:

y¨+2y˙+3y=4 \ddot {y} + 2 \dot {y} + 3 y = 4 y¨+2y˙+3y=4

首先,我们将上述方程重写为最高阶导数的形式:

y¨=−2y˙−3y+4 \ddot {y} = - 2 \dot {y} - 3 y + 4 y¨=−2y˙−3y+4

这可以表示为:

y˙y¨\]=\[01−3−2\]\[yy˙\]+\[01\]4 \\left\[ \\begin{array}{c} \\dot {y} \\\\ \\ddot {y} \\end{array} \\right\] = \\left\[ \\begin{array}{c c} 0 \& 1 \\\\ - 3 \& - 2 \\end{array} \\right\] \\left\[ \\begin{array}{c} y \\\\ \\dot {y} \\end{array} \\right\] + \\left\[ \\begin{array}{c} 0 \\\\ 1 \\end{array} \\right\] 4 \[y˙y¨\]=\[0−31−2\]\[yy˙\]+\[01\]4 在这种情况下,适当的状态空间矩阵为: x=\[yy˙\] \\boldsymbol {x} = \\left\[ \\begin{array}{c} y \\\\ \\dot {y} \\end{array} \\right\] x=\[yy˙

F=[01−3−2] \boldsymbol {F} = \left[ \begin{array}{c c} 0 & 1 \\ - 3 & - 2 \end{array} \right] F=[0−31−2]

G=[01] \boldsymbol {G} = \left[ \begin{array}{c} 0 \\ 1 \end{array} \right] G=[01]

u=4 \pmb {u} = 4 u=4

w=[00] \boldsymbol {w} = \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] w=[00]

基础矩阵 [2, 4]

基础矩阵(Fundamental Matrix)用于设计卡尔曼滤波器和高级制导律。如果我们有一个以状态空间形式表示的方程:

x˙=Fx \dot {x} = F x x˙=Fx

其中系统动力学矩阵 FFF 是时不变的,那么我们可以说存在一个转移矩阵或基础矩阵 Φ\PhiΦ,它可以用来根据下式将状态从任意时间 t0t_0t0 精确地推进到时间 ttt:

x(t)=Φ(t−t0)x(t0) \boldsymbol {x} (t) = \Phi (t - t _ {0}) \boldsymbol {x} (t _ {0}) x(t)=Φ(t−t0)x(t0)

对于时不变系统,寻找基础矩阵的两种简单方法是拉普拉斯变换法和泰勒级数展开法。对于拉普拉斯变换技术,我们使用:

Φ(t)=L−1[(sI−F)−1] \Phi (\boldsymbol {t}) = \mathcal {L} ^ {- 1} \left[ \left(\boldsymbol {s} \boldsymbol {I} - \boldsymbol {F}\right) ^ {- 1} \right] Φ(t)=L−1[(sI−F)−1]

其中 L−1\mathcal{L}^{-1}L−1 表示拉普拉斯逆变换。基础矩阵的泰勒级数展开法也可以使用,得到:

Φ(t)=eFt=I+Ft+(Ft)22!+⋯+(Ft)nn!+... \Phi (t) = \mathrm {e} ^ {F t} = I + F t + \frac {(F t) ^ {2}}{2 !} + \dots + \frac {(F t) ^ {n}}{n !} + \dots Φ(t)=eFt=I+Ft+2!(Ft)2+⋯+n!(Ft)n+...

一旦我们有了 Φ(t)\Phi(t)Φ(t),我们可以简单地通过用 t−t0t - t_0t−t0 替换 ttt 来找到 Φ(t−t0)\Phi(t - t_0)Φ(t−t0)。

我们在数值积分部分已经证明,微分方程

x¨=−ω2x \ddot {x} = - \omega^ {2} x x¨=−ω2x

的解是

x=sin⁡ωt x = \sin \omega t x=sinωt

利用微积分,我们可以看到解的导数为:

x˙=ωcos⁡ωt \dot {x} = \omega \cos \omega t x˙=ωcosωt

如果我们将原始二阶微分方程重写为状态空间形式,我们得到:

x˙x¨\]=\[01−ω20\]\[xx˙\] \\left\[ \\begin{array}{c} \\dot {x} \\\\ \\ddot {x} \\end{array} \\right\] = \\left\[ \\begin{array}{c c} 0 \& 1 \\\\ - \\omega\^ {2} \& 0 \\end{array} \\right\] \\left\[ \\begin{array}{c} x \\\\ \\dot {x} \\end{array} \\right\] \[x˙x¨\]=\[0−ω210\]\[xx˙

因此,系统动力学矩阵为:

F=[01−ω20] \boldsymbol {F} = \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] F=[0−ω210]

我们已经说过,对于时不变系统动力学矩阵,我们可以根据下式推导基础矩阵:

Φ(t)=L−1[(sI−F)−1] \Phi (\pmb {t}) = \mathcal {L} ^ {- 1} [ (\pmb {s I} - \pmb {F}) ^ {- 1} ] Φ(t)=L−1[(sI−F)−1]

其中 I\boldsymbol{I}I 是单位矩阵。代入适当的矩阵,我们首先将 sI−Fs\boldsymbol{I} - \boldsymbol{F}sI−F 的逆表示为:

(sI−F)−1=[s−1ω2s]−1 (\boldsymbol {s} \boldsymbol {I} - \boldsymbol {F}) ^ {- 1} = \left[ \begin{array}{c c} s & - 1 \\ \omega^ {2} & s \end{array} \right] ^ {- 1} (sI−F)−1=[sω2−1s]−1

2×22 \times 22×2 矩阵的求逆几乎可以通过观察完成,并且很容易证明为:

Φ(s)=(sI−F)−1=1s2+ω2[s1−ω21] \Phi (\boldsymbol {s}) = (\boldsymbol {s} \boldsymbol {I} - \boldsymbol {F}) ^ {- 1} = \frac {1}{s ^ {2} + \omega^ {2}} \left[ \begin{array}{c c} s & 1 \\ - \omega^ {2} & 1 \end{array} \right] Φ(s)=(sI−F)−1=s2+ω21[s−ω211]

我们现在有了拉普拉斯变换域或 sss 域中的基础矩阵。我们必须进行拉普拉斯逆变换,以将基础矩阵表示为时间的函数。上式的拉普拉斯逆变换可以从表 1.1 中找到。时域中的基础矩阵变为:

Φ(t)=[cos⁡ωtsin⁡ωtω−ωsin⁡ωtcos⁡ωt] \Phi (t) = \left[ \begin{array}{c c} \cos \omega t & \frac {\sin \omega t}{\omega} \\ - \omega \sin \omega t & \cos \omega t \end{array} \right] Φ(t)=[cosωt−ωsinωtωsinωtcosωt]

在使用另一种方法推导基础矩阵之前,让我们检查一下解的有效性。对于我们的示例问题,我们知道二阶线性微分方程的初始条件为:

x(0)=sin⁡ω(0)=0 x (0) = \sin \omega (0) = 0 x(0)=sinω(0)=0

x˙(0)=ωcos⁡ω(0)=ω \dot {x} (0) = \omega \cos \omega (0) = \omega x˙(0)=ωcosω(0)=ω

因为

x(t)=Φ(t−t0)x(t0) \boldsymbol {x} (t) = \Phi (t - t _ {0}) \boldsymbol {x} (t _ {0}) x(t)=Φ(t−t0)x(t0)

我们也可以说

x(t)=Φ(t)x(0) \boldsymbol {x} (t) = \Phi (t) \boldsymbol {x} (0) x(t)=Φ(t)x(0)

让我们通过代入来检查上述陈述:

x(t)x˙(t)\]=\[cos⁡ωtsin⁡ωtω−ωsin⁡ωtcos⁡ωt\]\[x(0)x˙(0)\]=\[cos⁡ωtsin⁡ωtω−ωsin⁡ωtcos⁡ωt\]\[0ω\]=\[sin⁡ωtωcos⁡ωt\] \\begin{array}{l} \\left\[ \\begin{array}{c} x (t) \\\\ \\dot {x} (t) \\end{array} \\right\] = \\left\[ \\begin{array}{c c} \\cos \\omega t \& \\frac {\\sin \\omega t}{\\omega} \\\\ - \\omega \\sin \\omega t \& \\cos \\omega t \\end{array} \\right\] \\left\[ \\begin{array}{c} x (0) \\\\ \\dot {x} (0) \\end{array} \\right\] \\\\ = \\left\[ \\begin{array}{c c} \\cos \\omega t \& \\frac {\\sin \\omega t}{\\omega} \\\\ - \\omega \\sin \\omega t \& \\cos \\omega t \\end{array} \\right\] \\left\[ \\begin{array}{c} 0 \\\\ \\omega \\end{array} \\right\] = \\left\[ \\begin{array}{c} \\sin \\omega t \\\\ \\omega \\cos \\omega t \\end{array} \\right\] \\\\ \\end{array} \[x(t)x˙(t)\]=\[cosωt−ωsinωtωsinωtcosωt\]\[x(0)x˙(0)\]=\[cosωt−ωsinωtωsinωtcosωt\]\[0ω\]=\[sinωtωcosωt

上式表明:

x(t)=sin⁡ωt x (t) = \sin \omega t x(t)=sinωt

x˙(t)=ωcos⁡ωt \dot {x} (t) = \omega \cos \omega t x˙(t)=ωcosωt

这是正确的。换句话说,一旦我们有了基础矩阵,我们就不必积分微分方程来向前推进状态。我们可以通过矩阵乘法来推进状态。在卡尔曼滤波中,我们必须将状态估计向前推进一个采样时间。如果我们有基础矩阵的精确表达式,我们将能够通过矩阵乘法执行推进。当无法获得精确的基础矩阵时,我们将不得不借助数值积分来向前推进状态估计。

为了说明通过泰勒级数展开也可以获得相同的基础矩阵答案,回想一下系统动力学矩阵为:

F=[01−ω20] \boldsymbol {F} = \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] F=[0−ω210]

因此,我们可以找到:

F2=[01−ω20][01−ω20]=[−ω200−ω2] \boldsymbol {F} ^ {2} = \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] = \left[ \begin{array}{c c} - \omega^ {2} & 0 \\ 0 & - \omega^ {2} \end{array} \right] F2=[0−ω210][0−ω210]=[−ω200−ω2]

F3=[−ω200−ω2][01−ω20]=[0−ω2ω40] \boldsymbol {F} ^ {3} = \left[ \begin{array}{c c} - \omega^ {2} & 0 \\ 0 & - \omega^ {2} \end{array} \right] \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] = \left[ \begin{array}{c c} 0 & - \omega^ {2} \\ \omega^ {4} & 0 \end{array} \right] F3=[−ω200−ω2][0−ω210]=[0ω4−ω20]

F4=[0−ω2ω40][01−ω20]=[ω400ω4] \boldsymbol {F} ^ {4} = \left[ \begin{array}{c c} 0 & - \omega^ {2} \\ \omega^ {4} & 0 \end{array} \right] \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] = \left[ \begin{array}{c c} \omega^ {4} & 0 \\ 0 & \omega^ {4} \end{array} \right] F4=[0ω4−ω20][0−ω210]=[ω400ω4]

F5=[ω400ω4][01−ω20]=[0ω4−ω60] \boldsymbol {F} ^ {5} = \left[ \begin{array}{c c} \omega^ {4} & 0 \\ 0 & \omega^ {4} \end{array} \right] \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] = \left[ \begin{array}{c c} 0 & \omega^ {4} \\ - \omega^ {6} & 0 \end{array} \right] F5=[ω400ω4][0−ω210]=[0−ω6ω40]

F6=[0ω4−ω60][01−ω20]=[−ω600−ω6] \boldsymbol {F} ^ {6} = \left[ \begin{array}{c c} 0 & \omega^ {4} \\ - \omega^ {6} & 0 \end{array} \right] \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] = \left[ \begin{array}{c c} - \omega^ {6} & 0 \\ 0 & - \omega^ {6} \end{array} \right] F6=[0−ω6ω40][0−ω210]=[−ω600−ω6]

如果我们将基础矩阵的泰勒级数展开截断为六项,我们得到:

Φ(t)=eFt≈I+Ft+(Ft)22!+(Ft)33!+(Ft)44!+(Ft)55!+(Ft)66! \Phi (t) = \mathrm {e} ^ {F t} \approx I + F t + \frac {(F t) ^ {2}}{2 !} + \frac {(F t) ^ {3}}{3 !} + \frac {(F t) ^ {4}}{4 !} + \frac {(F t) ^ {5}}{5 !} + \frac {(F t) ^ {6}}{6 !} Φ(t)=eFt≈I+Ft+2!(Ft)2+3!(Ft)3+4!(Ft)4+5!(Ft)5+6!(Ft)6

或者

Φ(t)≈[1001]+[01−ω20]t+[−ω200−ω2]t22+[0−ω2ω40]t36+[ω400ω4]t424+[0ω4−ω60]t5120+[−ω600−ω6]t6720 \begin{array}{l} \Phi (t) \approx \left[ \begin{array}{c c} 1 & 0 \\ 0 & 1 \end{array} \right] + \left[ \begin{array}{c c} 0 & 1 \\ - \omega^ {2} & 0 \end{array} \right] t + \left[ \begin{array}{c c} - \omega^ {2} & 0 \\ 0 & - \omega^ {2} \end{array} \right] \frac {t ^ {2}}{2} + \left[ \begin{array}{c c} 0 & - \omega^ {2} \\ \omega^ {4} & 0 \end{array} \right] \frac {t ^ {3}}{6} \\ + \left[ \begin{array}{c c} {\omega^ {4}} & 0 \\ {0} & {\omega^ {4}} \end{array} \right] \frac {t ^ {4}}{2 4} + \left[ \begin{array}{c c} {0} & {\omega^ {4}} \\ {- \omega^ {6}} & 0 \end{array} \right] \frac {t ^ {5}}{1 2 0} + \left[ \begin{array}{c c} {- \omega^ {6}} & 0 \\ {0} & {- \omega^ {6}} \end{array} \right] \frac {t ^ {6}}{7 2 0} \\ \end{array} Φ(t)≈[1001]+[0−ω210]t+[−ω200−ω2]2t2+[0ω4−ω20]6t3+[ω400ω4]24t4+[0−ω6ω40]120t5+[−ω600−ω6]720t6

执行所需的加法和减法并合并各项,得到:

Φ(t)≈[1−ω2t22+ω4t424−ω6t6720t−ω2t36+ω4t5120−ω2t+ω4t36−ω6t51201−ω2t22+ω4t424−ω6t6720] \Phi (t) \approx \left[ \begin{array}{c c} 1 - \frac {\omega^ {2} t ^ {2}}{2} + \frac {\omega^ {4} t ^ {4}}{2 4} - \frac {\omega^ {6} t ^ {6}}{7 2 0} & t - \frac {\omega^ {2} t ^ {3}}{6} + \frac {\omega^ {4} t ^ {5}}{1 2 0} \\ - \omega^ {2} t + \frac {\omega^ {4} t ^ {3}}{6} - \frac {\omega^ {6} t ^ {5}}{1 2 0} & 1 - \frac {\omega^ {2} t ^ {2}}{2} + \frac {\omega^ {4} t ^ {4}}{2 4} - \frac {\omega^ {6} t ^ {6}}{7 2 0} \end{array} \right] Φ(t)≈[1−2ω2t2+24ω4t4−720ω6t6−ω2t+6ω4t3−120ω6t5t−6ω2t3+120ω4t51−2ω2t2+24ω4t4−720ω6t6]

在认识到三角函数的泰勒级数展开为:

sin⁡ωt≈ωt−ω3t33!+ω5t55!−... \sin \omega t \approx \omega t - \frac {\omega^ {3} t ^ {3}}{3 !} + \frac {\omega^ {5} t ^ {5}}{5 !} - \dots sinωt≈ωt−3!ω3t3+5!ω5t5−...

cos⁡ωt≈1−ω2t22!+ω4t44!−ω6t66!+... \cos \omega t \approx 1 - \frac {\omega^ {2} t ^ {2}}{2 !} + \frac {\omega^ {4} t ^ {4}}{4 !} - \frac {\omega^ {6} t ^ {6}}{6 !} + \dots cosωt≈1−2!ω2t2+4!ω4t4−6!ω6t6+...

之后,我们获得了基础矩阵的更紧凑形式:

Φ(t)=[cos⁡ωtsin⁡ωtω−ωsin⁡ωtcos⁡ωt] \Phi (t) = \left[ \begin{array}{c c} \cos \omega t & \frac {\sin \omega t}{\omega} \\ - \omega \sin \omega t & \cos \omega t \end{array} \right] Φ(t)=[cosωt−ωsinωtωsinωtcosωt]

上式与拉普拉斯变换法得到的答案相同。

严格来说,寻找基础矩阵的泰勒级数方法仅适用于系统动力学矩阵为时不变的情况。然而,在系统动力学矩阵随时间变化的实际问题中,通常假设系统动力学矩阵在感兴趣的区域(即采样之间的时间)内近似恒定,并且仍然使用泰勒级数方法。

Z 变换与差分方程

我们已经证明拉普拉斯变换是表示微分方程的一种有用方法。在本书中,我们还需要模拟差分方程。Z 变换也可以用作表示差分方程的工程简写。在本节后面,我们还将展示如何使用 ZZZ 变换求解差分方程,并有时用于检查仿真结果 [4]。

如果我们定义 F(z)F(z)F(z) 为 f(n)f(n)f(n) 的 ZZZ 变换,则 ZZZ 变换定义如下:

F(z)=∑n=0∞f(n)z−n F (z) = \sum_ {n = 0} ^ {\infty} f (n) z ^ {- n} F(z)=n=0∑∞f(n)z−n

根据这个定义,很容易证明:时间或 nnn 域中的求和在 ZZZ 变换域中也是求和。例如,如果 f1(n)f_1(n)f1(n) 和 f2(n)f_2(n)f2(n) 的 ZZZ 变换分别为 F1(z)F_1(z)F1(z) 和 F2(z)F_2(z)F2(z),则:

Z[f1(n)±f2(n)]=F1(z)±F2(z) Z [ f _ {1} (n) \pm f _ {2} (n) ] = F _ {1} (z) \pm F _ {2} (z) Z[f1(n)±f2(n)]=F1(z)±F2(z)

可以证明,信号在 n+1n+1n+1 时刻的 ZZZ 变换相当于在 ZZZ 变换域中将函数乘以 zzz。nnn 时刻信号的 ZZZ 变换关系为:

Z(fn+1)=zF(z)−zf(0) Z (f _ {n + 1}) = z F (z) - z f (0) Z(fn+1)=zF(z)−zf(0)

其中 f(0)f(0)f(0) 是初始条件。通常我们将处理具有零初始条件的系统。

表 1.2 列出了一些常用的 ZZZ 变换。从表中我们可以看到,采样时间 TsT_sTs 与时间 ttt 之间存在如下关系:

t=nTs t = n T _ {s} t=nTs

为了说明如何使用 ZZZ 变换求解差分方程,让我们考虑一个涉及衰减记忆滤波器(fading memory filters)的数值示例,我们将在第 7 章中通过它进行工作。

表 1.2 常用函数的 Z 变换

函数 Z 变换
δ(n)\delta(n)δ(n) 111
111 z/(z−1)z/(z-1)z/(z−1)
ana^nan z/(z−a)z/(z-a)z/(z−a)
nnn z/(z−1)2z/(z-1)^2z/(z−1)2
sin⁡ωnTs\sin \omega n T_ssinωnTs zsin⁡ωTs/(z2−2zcos⁡ωTs+1)z \sin \omega T_s / (z^2 - 2z \cos \omega T_s + 1)zsinωTs/(z2−2zcosωTs+1)

最简单的衰减记忆滤波器可以表示为差分方程:

yn+1=yn+G(xn+1−yn) y _ {n + 1} = y _ {n} + G \left(x _ {n + 1} - y _ {n}\right) yn+1=yn+G(xn+1−yn)

其中 yyy 是滤波器估计值或输出,xxx 是滤波器输入或测量值,GGG 是滤波器增益。对于一阶衰减记忆滤波器,滤波器增益是设计者选择的 0 到 1 之间的数字。我们可以通过查阅表 1.2 观察到单位阶跃函数或常数的 ZZZ 变换为:

Z(1)=z/(z−1) Z (1) = z / (z - 1) Z(1)=z/(z−1)

从而找到滤波器对阶跃输入(即 xn+1=1x_{n+1} = 1xn+1=1)的响应。

因此,对差分方程两边取 ZZZ 变换得到:

zY=Y+G(zz−1−Y) z Y = Y + G \left(\frac {z}{z - 1} - Y\right) zY=Y+G(z−1z−Y)

如果我们把所有含 YYY 的项移到方程左边,得到:

Y(z−1+G)=Gz/(z−1) Y (z - 1 + G) = G z / (z - 1) Y(z−1+G)=Gz/(z−1)

求解 YYY 得到:

y=Gz(z−1)(z−a) y = \frac {G z}{(z - 1) (z - a)} y=(z−1)(z−a)Gz

其中

a=1−G a = 1 - G a=1−G

对 YYY 的解进行部分分式展开得到:

G(z−1)(z−a)=G1−a[1z−1−1z−a] {\frac {G}{(z - 1) (z - a)}} = {\frac {G}{1 - a}} \left[ {\frac {1}{z - 1}} - {\frac {1}{z - a}} \right] (z−1)(z−a)G=1−aG[z−11−z−a1]

因此,将上式两边同乘以 zzz,我们得到:

G(z−1)(z−a)=G1−a[zz−1−zz−a] {\frac {G}{(z - 1) (z - a)}} = {\frac {G}{1 - a}} \left[ {\frac {z}{z - 1}} - {\frac {z}{z - a}} \right] (z−1)(z−a)G=1−aG[z−1z−z−az]

利用表 1.2 查找上式的 ZZZ 逆变换,得到:

yn=G1−a(1−an) y _ {n} = \frac {G}{1 - a} (1 - a ^ {n}) yn=1−aG(1−an)

将 aaa 的值代入上式,得到 yyy 的解析解为:

yn=1−(1−G)n y _ {n} = 1 - (1 - G) ^ {n} yn=1−(1−G)n

我们现在有了滤波器输出随测量次数 nnn 变化的精确表达式。为了测试上述 yyy 的解析解的准确性,编写了原始差分方程的仿真程序,如清单 1.3 所示。从清单中我们可以看到,与前面的仿真不同,这里不需要数值积分。在这个仿真中,我们只是在 for 循环的每次迭代中求解差分方程以获得 yyy 的新值。正如我们从清单中看到的,仿真求解了 20 次差分方程。为了检查仿真的有效性,在每次迭代中也计算了 yyy 的解析解。

清单 1.3 差分方程仿真

matlab 复制代码
clear
G=.5;
X=1.;
TS=.1;
Y=0.;
T=0.;
N=0;
count=0;
YTHERORY=1.-(1.-G)^N;
for N=1:20
    Y=Y+G*(X-Y);
    T=N*TS;
    YTHERORY=1.-(1.-G)^N;
    count=count+1;
    ArrayT(count)=T;
    ArrayY(count)=Y;
    ArrayYTHERORY(count)=YTHERORY;
end;
figure
plot(ArrayT,ArrayY,ArrayT,ArrayYTHERORY),grid
title('Output')
xlabel('Y')
ylabel('Y')
clc
output=[ArrayT',ArrayY',ArrayYTHERORY'];
save dfutil.txt output -ascii
disp 'simulation finished'

从图 1.6 中我们可以看到,滤波器输出最终与滤波器输入匹配。滤波器输出达到其稳态值的 63%63\%63% 所需的时间就是滤波器时间常数。改变滤波器增益 GGG 将改变衰减记忆滤波器的时间常数。从图 1.6 中我们还可以看到,仿真结果与解析解一致。

图 1.6: 差分方程仿真结果与解析解一致。

总结

本章介绍了本书通篇使用的大多数数值技术的基础。解释了拉普拉斯变换在求解和表示微分方程中的效用。然后展示了如何使用二阶龙格-库塔数值积分技术求解微分方程。给出了一个代表性示例的 MATLAB 代码,以便读者能更好地理解数值积分是如何实际应用的。代码的编写方式使其易于应用于涉及其他微分方程的问题,而只需更改几行代码。本章还包括了有关状态空间表示法和基础矩阵重要性的入门材料。

参考文献

1\] Selby, S. M., Standard Mathematical Tables, 2nd ed., Chemical Rubber Co., Cleveland, OH, 1972. \[2\] Zarchan, P., and Musoff, H., Fundamentals of Kalman Filtering: A Practical Approach, 4th ed., AIAA, Reston, VA, 2015, pp. 1--13. \[3\] Press, W. H., Flannery, B. P., Teukolsky, S. A., and Vetterling, W. T., Numerical Recipes: The Art of Scientific Computation, Cambridge Univ. Press, London, 1986. \[4\] Schwarz, R., and Friedland, B., Linear Systems, McGraw-Hill, New York, 1965. ### 声明 本文翻译自Paul Zarchan的《Tactical and Strategic Missile Guidance: An Introduction (Seventh Edition,Volume1)》,仅用于个人学习和研究,无任何商业用途,如有侵权,请及时告知。