使用MATLAB对《最优估计基础》例题进行计算

        本人为导航工程专业学生,本学期学校开设了最优估计基础课程,使用的教材为《最优估计基础》,考虑到书中许多公式稍加改造并附上输入与输出接口后可应用于简单的实际问题,因此写下此文章用于记录本人在课程中使用matlab和书中的一些结论性公式与计算方法,如有错误还请各位指出。

目录

一、预备知识

二、最小二乘的计算

三、动态系统可控性与可测性的计算

四、卡尔曼滤波


一、预备知识

1.matlab创建矩阵的方法

使用[ ]创建矩阵,如:

A=[1 0;2 3];

则得到结果:

2.matlab创建对角阵方法

使用 diag()函数创建对角矩阵,如:

P=[1/3.5 1/2.7 1/4.0 1/3.0 1/2.5]
P=diag(P)

 则得到结果:

 3.matlab求逆阵的方法

使用inv()函数对矩阵取逆,如:

a2=[ 0.9061   -0.2500
   -0.2500    0.9833]

a3=inv(a2)

 则得到结果:

4.matlab求转置矩阵的方法

在矩阵前加" '  ",如:

B=[1 0;-1 0;-1 1;0 1;0 1]

a=B'

 则得到结果:

 5.matlab进行增广矩阵的操作

使用 “,”对矩阵进行横向增广,使用“;”对矩阵进行纵向增广,如:

a1=[1 2;3 4];
a2=[5 6;7 8];
a3=[a1,a2]
a4=[a1;a2]

 则得到结果:

 6.使用matlab创建合适的单位矩阵

使用eye()函数创建单位阵,使用size()函数获取矩阵的行列数,如:

H=[2 1;-1 2]
D=eye(size(H))

则得到结果:

7.使用matlab创建符号变量

使用syms函数创建符号变量,如:

syms s

则得到结果:

8.使用matlab进行拉普拉斯逆变换

使用函数ilaplace()函数对矩阵进行拉普拉斯逆变换,如:

syms s
D=eye(size(H));
ph2=ilaplace(inv(s*D-H))

 则得到结果:

 9.使用拉普拉斯逆变换法求状态转移矩阵的方法

使用状态方程的系数阵的单位矩阵与拉普拉斯变换中的s变量相乘并减去这个系数矩阵,对这个矩阵的逆阵求拉普拉斯逆变换,所得矩阵为状态转移矩阵,如:

已知系统的状态方程为𝑋^=[0 1;0 0]x,初始条件为x(0),试求状态转移矩阵

泰勒级数展开法为:

 

 拉普拉斯逆变换法:

syms s
A=[0 1;0 0];
D=eye(size(A));
ph2=ilaplace(inv(s*D-A))

 结果为:

 

二、最小二乘的计算

 1.最小二乘基本公式

最小二乘准则:残差平方和最小

 满足最小二乘准则的目标方程

 参数X的最小二乘估值为:

 2.例题

已知A点高程Ha=237.483m,B点高程247.120m,各段的观测值与各段之间的距离如表所示,每段的观测值具有不同的权重,用最小二乘法求C,与D的高程

 

 (1)根据已知信息列出残差方程

即:

编写程序:

clear;
B=[1 0;-1 0;-1 1;0 1;0 1];
P=[1/3.5 1/2.7 1/4.0 1/3.0 1/2.5];
P=diag(P);
L=[243.323;-243.330;-3.580;239.743;239.750];
xls=inv(B'*P*B)*B'*P*L

 运行结果如下

三、动态系统可控性与可测性的计算

 1.动态系统可控性的计算公式

(1)连续线性时不变系统的可控性条件

即:

 则系统可控

(2)离散线性时不变系统的可控性条件

 

 即:

则系统可控

例1:

 编写程序:

clear;
A=[1 0;2 3]
B=[0;2];
a1=(A^0)*B
a2=A*B;
b=A*A*B;
d=[a1,a2]
c=rank(d)

 结果为增广矩阵秩为1≠n因此该系统不可控

例2:

编写程序:

clear;
H2=[2 1];
A2=[1 -1;1 1];
M2=[H2;H2*A2];
n2=rank(M2)

 结果为增广矩阵秩为2=n因此该系统可控

  2.动态系统可测性的计算公式

 (1)连续线性时不变系统的可测性

 则系统可测

(2)离散线性时不变系统的可测性

例1:

 编写程序:

clear;
H1=[1 0];
A1=[-2 0;0 -3];
M1=[H1;H1*A1];
n1=rank(M1)

 结果为增广矩阵秩为1≠n因此该系统不可测

例2:

 编写程序:

H3=[0 1 0];
A3=[1 0 -1
    0 -2 1
    3 0 2];
M3=[H3;H3*A3;H3*A3*A3];
n3=rank(M3)

 结果为增广矩阵秩为3=n因此该系统可测

四、卡尔曼滤波

(1)卡尔曼滤波基本公式

 (2)典型例题

例:

已知离散线性系统的状态方程和观测方程如下:

 并已知:

 试求卡尔曼滤波估计和滤波误差方差阵

编写程序:

Xk0=[2.5;-4.5];
Dx0=[4 0;0 1];
z1=0.8;
Dk1=[1 0;0 0];
Ddeta=1;
H=[0 1];
f=[3 1;-2 1];
L=[1 0;0 0];
Xk1=f*Xk0;
Dk=f*Dx0*f'+L*Dk1*L'
K=Dk*H'*inv(H*Dk*H'+Ddeta);
V=z1-H*Xk1;
X=Xk1+K*V;
Dx=(eye(size(K*H))-K*H)*Dk

 结果为:

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我给你举一个MATLAB实现最优存款策略的例题: 假设你有1000元,可以选择在银行A或银行B存款,存款期限分别为1年和2年,年利率分别为5%和6%,通胀率为3%。你希望在3年内获得最大收益,该怎么做? 1. 定义状态空间、动作空间和奖励函数: 状态空间:(a, t, i),其中 a 表示当前存款金额,t 表示当前存款期限,i 表示当前通胀率。 动作空间:存款或取款。 奖励:存款利息或惩罚成本等。 2. 构建MDP模型: ```matlab S = [1000, 1, 0.03; 1000, 2, 0.03]; % 状态空间 A = ["存款", "取款"]; % 动作空间 % 定义奖励函数 function r = reward(state, action, nextState) a = state(1); % 当前存款金额 t = state(2); % 当前存款期限 i = state(3); % 当前通胀率 na = nextState(1); % 下一步存款金额 nt = nextState(2); % 下一步存款期限 ni = nextState(3); % 下一步通胀率 if action == "存款" if nt > t % 存款期限变长 r = (na - a) * (1 + 0.05) ^ t - (na - a) * (1 + 0.06) ^ (nt - t) + (ni - i) * na; else % 存款期限不变 r = (na - a) * (1 + 0.05) ^ t + (ni - i) * na; end else % action == "取款" r = (a - na) + (ni - i) * na; end end % 定义转移概率函数 function p = transition(state, action, nextState) % 状态转移只与动作有关,与奖励无关 if action == "存款" p = 1; else % action == "取款" p = 1; end end mdp = rlMDP(S, A, @reward, @transition); ``` 3. 使用policy iteration算法求解最优策略: ```matlab % 定义初始策略为随机策略 P = rlFiniteSetPolicy(mdp); P = rlFunctionPolicy(mdp, P); % 使用policy iteration算法求解最优策略 opt = rlPolicyIterationOptions; opt.MaxIterations = 100; opt.PolicyThreshold = 1e-6; [Q, P] = rlPolicyIteration(mdp, P, opt); ``` 4. 根据最优策略制定存款计划: ```matlab % 根据最优策略制定存款计划 s = [1000, 1, 0.03]; % 初始状态 plan = []; for i = 1:3 % 总共三年 action = evaluate(P, s); % 根据最优策略选择动作 if action == "存款" plan(i, :) = [s, "存款", 1000]; s = [1000 + Q(s, "存款", [1000 + s(1) * 1.05, s(2), s(3)]), s(2) + 1, 0.03]; % 更新状态 else % action == "取款" plan(i, :) = [s, "取款", 1000]; s = [s(1) - 1000, s(2), 0.03]; % 更新状态 end end plan ``` 最终的计划结果为: ``` ans = 1000 1 0.03 "存款" 1000 1050.0000 2 0.03 "存款" 1000 1110.0000 3 0.03 "取款" 1000 ``` 即第一年存款1000元,第二年在银行A存款1050元,第三年在银行B取款1110元,总收益为$1050\times1.05 + 1110\times(1+0.06)^{-2} - 1000 = 121.15$元。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值