Matlab在制导控制的应用(科学计算)
# Matlab在制导控制中的应用——科学计算
# 线性代数问题
# 特殊矩阵
- 对角矩阵
A = diag([1,2,3,4,5]);
%% 返回阶数为 n 的 Hilbert 矩阵。Hilbert 矩阵是病态矩阵的典型示例。Hilbert 矩阵的元素由 H(i,j) = 1/(i + j – 1) 指定。
H = hilb(n); % n阶Hilbert Matrix
inv_H = invhilb(n) % n阶Hilbert矩阵的逆矩阵
%% 返回其第一列是 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
V = vander([1,2,3,4])
%% 返回阶次为 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)
上次更新: 2022/04/07, 13:46:09