Sirius' blog Sirius' blog
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Sirius0v0

怕什么真理无穷,进一寸有一寸的欢喜
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 学习笔记

    • Matlab在数模上的应用——基础打杂篇
    • Matlab在制导控制的应用(科学计算)
      • 线性代数问题
        • 特殊矩阵
        • 基本运算
        • 矩阵的变换与分解
        • 代数方程求解
      • 求解微积分
        • 微积分问题解析解
        • 微积分问题数值解
        • 常微分方程数值解
      • 求解优化问题
        • 非线性方程组求解
        • 无约束的优化问题
        • 约束下的优化问题
      • 插值、拟合和统计
        • 插值
        • 拟合
        • 统计
    • Matlab在制导控制的应用(线性控制)
    • S-Function入门——基础介绍
    • Level-1 Matlab S-Function编写入门
    • C-Mex S-Function编写入门
  • 踩坑记录

  • 《MATLAB》与控制
  • 学习笔记
Sirius0v0
2021-03-13
目录

Matlab在制导控制的应用(科学计算)

# Matlab在制导控制中的应用——科学计算

# 线性代数问题

# 特殊矩阵

  • 对角矩阵
A = diag([1,2,3,4,5]);
  • Hilbert矩阵(希尔伯特矩阵) (opens new window)
%% 返回阶数为 n 的 Hilbert 矩阵。Hilbert 矩阵是病态矩阵的典型示例。Hilbert 矩阵的元素由 H(i,j) = 1/(i + j – 1) 指定。
H = hilb(n);	% n阶Hilbert Matrix
inv_H = invhilb(n)	% n阶Hilbert矩阵的逆矩阵
  • Hankel矩阵(汉克尔矩阵) (opens new window)
%% 返回其第一列是 c 并且其第一个反对角线下方的元素为零的 Hankel 方阵。
H = hankel([1,2,3,4])

H =

     1     2     3     4
     2     3     4     0
     3     4     0     0
     4     0     0     0
  • Vandermonde矩阵(范德蒙德矩阵) (opens new window)
V = vander([1,2,3,4])
  • Hadamard矩阵(阿达马矩阵) (opens new window)
%% 返回阶次为 n 的Hadamard 矩阵
% 每个元素都是+1或-1,每行都是互相正交的
H = hadamard(n);

# 基本运算

% 矩阵的行列式
det(A)

% 矩阵的迹
trace(A)

% 矩阵的秩
rank(A)

% 矩阵的范数
norm(A,options)

% 矩阵的特征多项式
poly(A)

% 多项式求值
polyval(a,x)	% a:多项式系数

% 矩阵的逆
inv(A)

# 矩阵的变换与分解

  • 相似变换与正交分解
% 正交矩阵
orth(A)

% 化零矩阵
null(A)
  • 矩阵的三角分解
% LU分解
[L,U] = lu(A)
  • 对称矩阵的Cholesky分解
[D,P] = chol(A)
  • 矩阵的奇异值分解
[L,A1,M] = svd(A)

# 代数方程求解

  • 线性代数方程求解
%%%%%% 唯一解 %%%%%%
X = A\B

%%%%%% 无穷解 %%%%%%
A = [1 2 3 4;2 2 1 1;2 4 6 8;4 4 2 2];
B = [1;3;2;6];
C = [A B];
[rank(A) rank(C)]		% 判断A C的秩均=2小于矩阵的阶次
Z = null(sym(A));		% 基础解系矩阵
x0 = sym(pinv(A))*B;	% 任意一特解
syms a1 a2;
x = Z * [a1; a2] + x0

%%% 对矩阵进行基本行变换(以此求解代数方程的解析解) %%%
C1 = rref(sym(C))

%%%%%% 方程无解 %%%%%%
% rank(A) < rank(C) 则无解
A = [1 2 3 4;2 2 1 1;2 4 6 8;4 4 2 2];
B = [1;2;3;4];
x = pinv(A)*B
err = A*x - B

对于无解方程,利用Moore-Penrose pseudoinverse(摩尔-彭若斯广义逆) (opens new window)求解原方程最小二乘解

  • Kronecker积与矩阵方程求解
help kron

% 一个例子是李雅普诺夫方程的求解
help lyap
  • Riccati方程(黎卡提方程)求解
X = are(A,B,C)

# 求解微积分

# 微积分问题解析解

# 极限问题

limit(f,x,a);				% 求极限
limit(f,x,a,'right');		% 右极限
limit(f,x,a,'left');		% 左极限

# 导数问题

diff(f,x,n)		% 求解f在x的n阶导数
jacobian(f,x)	% 求多元函数f(x)的Jacobian矩阵
taylor(f,x,a)	% 求f在x=a处的泰勒展开
taylor(f,x,a,'Order',n)	% 求解f在x=a处的泰勒展开忽略n阶小量

# 级数求和

% 求解级数求和问题的解析解
symsum(f,k,a,b)			% 求通式f在指定变量k取遍[a,b]时的和【b = inf可行】

# 积分问题

int(f,var)			% 给出f对指定变量var的不定积分
int(f,var,a,b)		% 在指定区间上求解定积分

# 微积分问题数值解

# 差分及微分

% 差分
diff(y)

% n阶差分
diff(y,n)

% 内点中心差分:gf_n = (f_n+1 - f_n-1)/2
gradient(y)

# 积分数值解

S = integral(fun, xmin, xmax)

% 定义fun
fun1 = @(x)x.*exp(-x.^2);

function y = fun2(x)
y = x.*exp(-x.^2);
end

% 调用
S1 = integral(fun1,0,1);
S2 = integral(@(x)fun2(x),0,1);

# 多重积分数值解

% 二重闭环数值积分
S = integral2(fun,xmin,xmax,ymin,ymax);

% 三重闭环数值积分
S = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax);

# 常微分方程数值解

# 常微分方程求解函数

  • 调用格式(函数用solver代替)
sol = solver(odefunc,tspan,y0);

函数名:ode45 ode23 ode113 ode15s ode23s ode23t ode23tb

# 常微分方程函数设置

% 相关函数
odeset()
odeget()

# 高阶常微分方程函数转换

$$ y^{(n)}=f(t,y,y^{'},y^{''},\dots,y^{(n-1)}) \ 通过增加一组状态变量\ x_1 = y,x_2= y^{'},x_3 = y^{''},x_n = y^{(n-1)}\ 则\ x_1^{'} = x_2\ x_2^{'} = x_3\ ...\ x_n^{'} = f(t,x_1,x_2,...,x_n) $$

# 求解优化问题

# 非线性方程组求解

x = fsolve(fun,x0);		% x0迭代初值
[x, fval] = fsolve(fun,x0);		% 带残差的调用格式

# 无约束的优化问题

% 单变量固定区间内最小值
x = fminbnd(fun, x1, x2[, options]);

% 多变量求最小值
x = fminsearch(fun,x0)	% x0搜索起点:标量为单起点;行向量为多个起点;列向量为单起点

# 约束下的优化问题

x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);
% fun 函数
% x0 搜索起点
% A, b 线性不等约束(小于等于)
% Aeq, beq 线性等式约束
% lb, ub变量上下界约束
% nonlcon 非线性不等约束函数句柄

% 相关算法行为设置
help optimget
help optimset

% 举例
function [cx, ceqx] = func(x)
    cx = zeros(2,1);
    cx(1) = -x(1)+x(2)*sqrt(x(1)+20)-11;
    cx(2) = -x(1)-x(2)*abs(0.5*x(1)+1)-10;
    ceqx = [];
end

fun = @(x) exp(x(1))*(2*x(1)^2+3*x(2)^2+2*x(1)*x(2)+3*x(1)+4*x(2));
[x,fval] = fmincon(fun,[0 0],[],[],[],[],[],[],@func);

# 插值、拟合和统计

# 插值

% 一维插值
vq = interp1(x,v,xq);

% 二维插值
vq = interp2(x,y,v,xq,yq);

% 相关插值方法
doc interp1

# 拟合

% 多项式拟合
p = polyfit(x,y,n);		% n次多项式拟合

% 最小二乘法非线性曲线拟合
% 即给定特定待拟合曲线函数求解待定系数
a = lsqcurvefit(fun, a0, xdata, ydata)
a = lsqcurvefit(fun, a0, xdata, ydata, lb, ub);		% a0为待定系数初始搜索值;lb, ub为待定系数上下界

# 统计

# 均匀&正态分布随机数

% [0,1]均匀分布随机数
x = rand;
x = rand(n);
x = rand([sz1:szN]);	% 产生指定纬度的均匀分布矩阵
x = rand([3,2,3]) 		% 随机数组成的 3×2×3 数组

% [a,b]均匀分布随机数
x = a + (b-a)*rand;

% 正态分布[N(0,1)]随机数
x = randn;
x = randn(n);
x = randn([sz1:szN]);

% 正态分布[N(mu,sigma2)]随机数
x = mu + sigma * randn;

# 正态高斯分布

R = normrnd(mu, sigma)

# 泊松分布

R = poissrnd(lambda)

# 二项分布

% 二项分布
R = binornd(N,P)

% 负二项分布
R = nbinrnd(R,P)

# 卡方分布

% 卡方分布
R = chi2rnd(V)

% 非中心卡方分布
R = ncx2rnd(V,DELTA)

# 指数分布

R = exprnd(mu)

# F分布

% F分布
R = frnd(V1, v2)
R = gamrnd(A, B)
R = geornd(p)

% 非中心F分布
R = ncfrnd(NU1, NU2, DELTA)

# 伽玛分布

R = hygernd(M, K, N)

# 学生氏T分布

% T分布
R = trnd(nu)

% 非中心T分布
R = nctrnd(V, DELTA)

# 瑞丽分布

R = raylrnd(B)

# 贝塔分布

R = betarnd(A, B)

# 对数正态分布

R = lognrnd(mu, sigma)

# 连续均匀分布

R = unifrnd(A, B)

# 离散均匀分布

R = unidrnd(N)

# 概率统计函数

% 极值
min()
max()

% 均值
M = mean(A)

% 中位数
MD = median(A)

% 标准差
S = std(A)

% 方差
V = var(A)

% 极差
R = range(A)

% 协方差
C = cov(A)
C = cov(A, B)

% 相关系数
R = corrcoef(A)
R = corrcoef(A, B)
编辑 (opens new window)
#MATLAB#控制学
上次更新: 2022/04/07, 13:46:09
Matlab在数模上的应用——基础打杂篇
Matlab在制导控制的应用(线性控制)

← Matlab在数模上的应用——基础打杂篇 Matlab在制导控制的应用(线性控制)→

最近更新
01
ipopt优化库配置及使用
07-21
02
ubuntu离线安装包的方法
07-21
03
其它控件的使用
03-05
更多文章>
Theme by Vdoing | Copyright © 2020-2024 Sirius0v0 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式