求解含左右未知量的线性方程组$Lx=Ry$的非列重组方法
要解决这个问题,核心是在保留L和R列顺序的前提下,通过提取子矩阵而非重排列的方式,把未知量集中到左侧、已知量移到右侧。结合题目中“每个未知x对应已知y,反之亦然”的条件,我们可以按以下步骤操作:
1. 先明确索引划分
首先定义两个索引集合:
- $\mathcal{U}$:向量x中未知量的位置索引,同时这也是y中已知量的位置索引(因为题目说未知x对应已知y)
- $\mathcal{K}$:向量x中已知量的位置索引,同时这也是y中未知量的位置索引(反之亦然)
举个直观的例子:如果x的第1、3个元素是未知,第2个是已知,那么y的第1、3个元素是已知,第2个是未知——$\mathcal{U} = {1,3}$,$\mathcal{K} = {2}$。
2. 提取原矩阵的子矩阵(不改变列顺序)
基于上面的索引,从L和R中提取对应列的子矩阵(完全保留原列的顺序,只是选取需要的列):
- $L_U$:L中所有列索引属于$\mathcal{U}$的子矩阵(对应x的未知部分)
- $L_K$:L中所有列索引属于$\mathcal{K}$的子矩阵(对应x的已知部分)
- $R_U$:R中所有列索引属于$\mathcal{U}$的子矩阵(对应y的已知部分)
- $R_K$:R中所有列索引属于$\mathcal{K}$的子矩阵(对应y的未知部分)
3. 重组为标准线性方程组
把原方程 $Lx = Ry$ 展开并移项,将未知量全部移到左侧,已知量移到右侧:
原方程展开后是:
$$L_U x_U + L_K x_K = R_U y_U + R_K y_K$$
移项整理成标准形式:
$$\begin{bmatrix} L_U & -R_K \end{bmatrix} \begin{bmatrix} x_U \ y_K \end{bmatrix} = R_U y_U - L_K x_K$$
这里的关键是:
- 左侧的系数矩阵 $\begin{bmatrix} L_U & -R_K \end{bmatrix}$ 完全由L和R的原列组成,没有任何列的重排,完美保留了L和R的列结构
- 右侧是纯已知量的线性组合,计算后就是常数项向量
- 未知向量 $\begin{bmatrix} x_U \ y_K \end{bmatrix}$ 包含了所有待求的未知量
4. 求解并还原结果
因为题目说明原方程组有唯一解,所以重组后的系数矩阵 $\begin{bmatrix} L_U & -R_K \end{bmatrix}$ 是可逆的,你可以用常规的线性方程组求解方法(比如LU分解、QR分解,或者直接求逆)解出未知向量 $z = \begin{bmatrix} x_U \ y_K \end{bmatrix}$,最后把解出的$x_U$和$y_K$放回原x和y的对应位置即可。
编程实现示例(伪代码)
假设用Python的numpy库,代码大概是这样:
import numpy as np # 假设已知:L, R(方阵),x, y(包含已知/未知的向量) # 先定义索引集合U和K(比如用布尔数组或整数列表) U = [0, 2] # x中未知量的索引(假设0-based) K = [1] # x中已知量的索引 # 提取子矩阵 L_U = L[:, U] L_K = L[:, K] R_U = R[:, U] R_K = R[:, K] # 提取已知向量部分 x_K = x[K] y_U = y[U] # 构造常数项b b = R_U @ y_U - L_K @ x_K # 构造系数矩阵M M = np.hstack([L_U, -R_K]) # 求解Mz = b z = np.linalg.solve(M, b) # 还原x和y的未知部分 x[U] = z[:len(U)] y[K] = z[len(U):]
这样操作下来,完全没有打乱L和R的列结构,同时顺利完成了未知量和已知量的分离求解。
内容的提问来源于stack exchange,提问作者Pekov

