Matlab数值计算
1. Matlab常用函数补充
其他
...表示一行未结束,换行。
数据结构
-
cell创建元胞,访问元胞用{ }。 -
struct创建结构体,它是有名字的元胞。
矩阵
-
A(end)可以访问数组最后的一个元素。 -
rand,randn,randi产生的随机数分别为均匀随机分布、正态随机分布、均匀随机分布整数。 -
diag对角矩阵,blkdiag对角块矩阵。 -
sqrtm矩阵的主平方根。 -
hilb希尔伯特矩阵。 -
hadamard阿达马(Hadamard)矩阵。 -
wilkinson威尔金森(Wilkinson)矩阵。 -
gallery可用于生成多种特殊的矩阵。
字符串
findstr,strrep分别为字符串种查找字串、替换字串。
2维绘图
-
fplot画图时自动确定采样频率。 -
y=@(t) sin(x.^3)定义了一个匿名函数。 -
xlim,ylim限制了坐标轴的显示范围,常用于看图像的局部。
3维绘图
-
meshgrid生成一个2维的完全点集。 -
surfl,contour,contourf分别表示曲面、三维等高线、2维填充等高线。
2. 线性方程组和特征系统
线性方程组$Ax=b$
-
可用
x = A\b求解,相当于x=b/A或者x=inv(A)*b。\或/运算符会根据矩阵的特征采用不同的算法,可以求欠定、正定、超定等等各种方程。 -
利用
inv(A) = adj(A) / |A|来求逆的效率很低,尽量少用。 -
b=0则为 齐次 方程组。 -
|A| = 0表示矩阵A是 奇异 的,他的逆矩阵不存在,此时方程组无解或者有无穷多解。 -
rank(A)表示矩阵A的 秩,它代表了矩阵中线性无关的行(或列)的个数,同时也是 约化阶梯矩阵rref(A)非零行的个数。 -
当
size(A) = [m,n],rank(A) = min(m,n)表示A满秩,也就是方程有唯一解。 -
超定:方程个数大于未知数个数。
-
病态方程组 是指
A中元素微小的变化都会导致解的巨大变化,在近似解时会很大的影响精度。 可用cond或rcond来判断矩阵的良态。 前者的范围是 1 到正无穷,1 表示完美良态。 后者从 0 到 1 ,0 表示完美良态。rcond的计算比较不准确,但速度快。 希尔伯特矩阵是非常病态的。 -
当
A不是方阵,无法求逆。可以使用 伪逆$A^+$
$A^+=(A^TA)^{-1}A^T \quad m>n$
$A^+=A^T(AA^T)^{-1} \quad m<n$,此公式要求A是满秩的。
当然不满秩也能求,$A^+=VS^TSV^T \quad s.t. \quad [U,S,V]= svd(A)$。
使用pinv即可自动求伪逆而不用关心是否满秩和m、n的大小。
伪逆常用于求解超定或者欠定方程组,但其实\符号已经包括了这个功能。
要求非负的解可用lsqnonneg,这是一个非负的最小二乘问题。 -
稀疏矩阵
-
sparse(A)将A转化为稀疏形式,当然前提是A本身是稀疏的。full是逆过程。 -
issparse可判断函数是否稀疏。 -
nnz给出矩阵中非0元素个数。 -
sprandn、sprandsys、sprandn分别生成稀疏正态分布随机矩阵、稀疏随机对称矩阵、稀疏正态分布随机整数矩阵。 -
利用稀疏矩阵能极大加速运算。
-
-
eig用于求特征值。eigs求部分特征值。
3. 非线性方程组的解
-
二分法
-
不动点(迭代)法
-
牛顿法
fnewton -
贝尔斯托法
bairstow -
roots -
施罗德法
schroder -
布罗伊登法
broyden -
fzero
TODO:各种方法的适用场景