2026a

# slvblk


求解几乎块对角线性系

函数库: TyCurveFitting

# 语法

x = slvblk(blokmat,b)
x = slvblk(blokmat,b,w)

# 说明

x = slvblk(blokmat, b) 返回线性系 的解(如果存在的话),其中矩阵 A 以样条几乎块对角型存储在 blokmat 中。目前,仅指令 spcol 提供这样的描述,其中矩阵元素为 B 样条在某些点的某些阶导数(包括第 0 阶,亦即函数值)的值。如果这个线性系超定(满秩,且方程数量多于未知数数量),则返回最小二乘解。

右侧的 b 可能有好几列,它的行数应该与 blokmat 描述的矩阵的行数相同。示例


x = slvblk(blokmat,b,w) 返回加权 的最小化向量 x。

# 示例

求解几乎块对角线性系

使用 spcol 生成一个几乎块对角矩阵。

using TyCurveFitting
using TyMath
colmat = spcol((1:6)',3,.1 .+(2:4)',"sl")

令 y 为某些点的正弦,求解该几乎块对角矩阵。

coefs = slvblk(colmat,sin.(1:3))
coefs = 3×1 Matrix{Float64}:

  1.4214191948768709
  0.5667319661085738
 -0.1498414207018735

计算结果与真实解之间的残差模,注意此时的 colmat 为可以被 slvblk 接受的块对角阵形式,而非真正的块对角阵,因此这里需要重新生成它代表的块对角阵 colmatdig。

colmatdig = spcol((1:6)',3,.1 .+(2:4)')
norm(colmatdig*coefs-sin.(1:3))
ans = 2.498001805406602e-16

# 算法

bkbrk 用来得到由 blokmat (以一种可接受的形式)描述的系数矩阵的必要部分。

每个对角块都会在使用下一个对角块分解中未使用的方程进行扩大后进行 QR 分解。结果的分解会被回代以求解线性系。

# 另请参阅

bkbrk | spap2 | spapi | spcol