LU 分解的 Matlab 实现还挺实用,适合线性方程组那一类问题。你只要用个lu()
函数,基本就搞定大半了,响应也快,代码也清爽。尤其对那种大型稀疏矩阵,效率确实比常规方法高不少。
像[L,U,P] = lu(A)
,一行就能分出来下三角L
、上三角U
,还有个置换矩阵P
,方便你做行交换。Matlab 里对 pivoting 得还不错,不容易出数值不稳定那种大坑。
用 L、U 分解之后,解Ax=b
其实就两步:先解Ly=Pb
,再解Ux=y
,一步步来,计算压力也不大。尤其是你需要重复解多个不同右端项的线性系统时,LU 分解是真的省心。
代码怎么写?其实直白:
[L,U,P] = lu(A);
y = L \ (P * b);
x = U \ y;
如果你是搞工程仿真、数据、甚至偏微分方程那块的,这招你一定要熟。顺带说一句,E2_韩明岗
那个文件夹里的内容也蛮值得看看,代码和结合得挺紧凑。
提醒一下,数值稳定性是关键,别忘了行交换和 pivoting 这事儿。用lu()
的时候可以顺手看看P
,不然出错了还真不好排查。
如果你想深入点,这几个链接还挺对路子: