求解Ax=0:主变量、自由变量、特殊解

上一篇简单介绍了列空间(column space)和零空间(null space),这一次主要介绍如何求出零空间内的向量,即主要讨论Ax=0。假设有矩阵A=,略微观察一下其行和列可看出,列2是列1的倍数,行3等于行1加行2,他们都是相关的,这些相关性会在消元中体现出来。当我们对A进行消元,在消元的过程中,解是不会变的,因此零空间不会变化,但列空间会随着消元发生改变,对A的消元过程如下,最终得到矩阵U。

从上面的消元我们可以看出,最后一行全为0,消元可以告诉我们如果有行变成了全0,那么那一行必定是其他行的线性组合,消元会将这些没有用的行消除。A有两个主元(pivots):第1行的1以及第2行的2,主元的个数可以称为矩阵的秩(rank of matrix),两个主元所在的列称为主元列(pivot columns),在本例中是列1和列3,其他两列即列2和列4称为自由列(free columns),与主元列对应的x称为主变量(pivot variable),如x1和x3,与自由列对应的变量称为自由变量(free variable),如x2和x4,自由的意思就是x2和x4可以任取。更为一般的结论,假设矩阵A大小为m*n,在消元过程中发现其有r个主变量,即秩是r,那么这个矩阵就有n-r个自由变量。对于上面举的例子,现在取x2=1,x4=0,就可得到零空间中的一个向量 ,容易理解更一般的形式 都是Ax=0的解,由于x2和x4是自由变量,因此我也可以取x2=0,x4=1,这样得到的另一个解向量 ,容易理解更一般的形式 也都是Ax=0的解,这两组解也称为方程的特殊解(special solution),特殊体现在我们给自由变量取了特定值,即每次让一个自由变量为1,其他自由变量为0,最终零空间就是这两个向量所有的线性组合,注意当自由变量选取其他值时,得到的最终解全是这两个向量的线性组合。

那么上面的这两解跟矩阵A到底是什么关系呢?可不可以当满足一定条件时,我们就能直接写出这两个基解x,而不用去进行回代(backsubstitution)呢?

首先尽管我们已经对A进行了化简,得到了看起来像阶梯状的矩阵U,但为了更容易求特殊解,其实我们可将U进一步化简,得到U的简化行阶梯阵(reduced row echelon form of U),记为R,过程为对U向上消元,即让主元的上方也变成0,简化过程如下。

上面第2步到第3步是为了让主元为1,所以将第2行除以了2,MATLAB中有专门的函数rref(reduced row echelon form of matrix)函数可以完成上面A到R的整个过程,R以最简单的形式包含了所有信息,首先它指出了主元行,即第1行和第2行,指出了主元列,即列1和列3,另外它还包含了一个单位阵,位于主元行与主元列的交汇处,现在我们将R中的主元列与自由列分开,即交换一下列,使得主元列在一起,自由列在一起,R就变成 ,假设矩阵R中的部分记为F, 部分记为I,那么仔细观察前面得到的两个解  ,由于前面系数矩阵R交换了列,因此这里两个解也需交换位置得到 ,仔细观察可发现这两个解恰好为

现在给出上面结论的推导过程。

现假设方程组已经消元和简化到rref形式R,且列顺序已经调整,即R矩阵主列都在前,自由列都在后,R的下面是一些0行,即R= ,那么Rx=0的特殊解是什么呢?我们可以构造一个零空间矩阵(null space matrix)N,它的各列由特殊解组成,则N满足RN=0,也就是说=0 ,这意味着,所以如果给 赋值单位阵(意思就是每次给一个自由变量赋值为1,其他的自由变量都是0),那么 就等于

下面我们再用A的转置,将整个过程过一遍。

从R中可看出,A的转置的秩仍然是2,其实这里有一个重要结论:矩阵主元的个数与其转置的主元个数相同。列1和列2是主元列(记住主元上下的元素都为0,因此单位阵所在的列就是主元列),列3是自由列,接下来就是令自由变量x3=1,在R中I=,则x=,注意最后一个自由变量x3=1对应的是单位阵,虽然只有一个1,但它也是单位阵,所以以上就是今天介绍的如何求Ax=0的特殊解,注意无论何时Ax=0是肯定有解的,即总有一个零解满足方程,但非零解不一定存在,也就是特殊解不一定存在,特殊解的个数等于自由变量的个数,这些特殊解可以说是Ax=0的基解,也就是说我们对自由变量取不同的值时得到的解向量都是这些特殊解的线性组合,因此求出了特殊解,也就相当于求出了Ax=0的所有的解。

### 决矩阵方程 \( AX = XB \) 矩阵方程 \( AX = XB \) 可以视为一种特殊的线性矩阵方程,其中 \( A \) 和 \( B \) 是已知的矩阵,\( X \) 是待求解的未知矩阵。这类方程通常通过将矩阵方程转换为向量形式并利用Kronecker积来处理。 #### Kronecker 积法 为了简化该类型的矩阵方程,可以采用如下变换: \[ (I_p \otimes A - B^T \otimes I_n)\text{vec}(X)=0 \] 这里, - \( I_p \) 表示维度为 \( p \times p \) 的单位矩阵, - \( I_n \) 表示维度为 \( n \times n \) 的单位矩阵, - \( \otimes \) 表示克罗内克乘积运算符, - \( \text{vec}(X) \) 将矩阵 \( X \) 向量化成一个长列向量[^1]。 此方法允许把原始问题重写为标准齐次线性统的形式,从而能够应用常规技术找到非平凡(如果存在)。 #### 使用MATLAB求解 当考虑数值稳定性时,在 MATLAB 中推荐使用斜杠操作符 `\` 来代替显式地计算逆矩阵。对于给定的具体实例,假设已经构建好了相应的增广数矩阵,则可以直接调用 `null()` 函数获取基础析空间的一组基底作为可能存在的多个之一[^3]。 ```matlab % 假设A和B已经被正确定义 % 构建增广矩阵 M=(I⊗A-B'⊗In) M = kron(eye(p), A) - kron(B.', eye(n)); % 寻找零空间的基础 Z = null(M); if isempty(Z) disp('No non-trivial solution exists.'); else % Z包含了所有独立变量构成的空间内的潜在决方案 end ``` #### 利用Eigen库实现C++代码片段 在某些编程环境中比如 C++ 下面借助于 Eigen 库也可以高效完成同样的任务: ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { MatrixXd A(m,n); // 定义适当大小的矩阵A MatrixXd B(p,q); // 定义适当大小的矩阵B // ... 初始化A,B... int np = n * p; // 计算np值用于创建大矩阵 MatrixXd K(np,np); // 创建(I ⊗ A − BT ⊗ In) for(int i=0;i<p;++i){ K.block(i*n,(p-i-1)*n,n,n)=-B.row(i).transpose()*MatrixXd::Identity(n,n); } for(int j=0;j<n;++j){ K.col(j*p+j)+=MatrixXd::Identity(p,p).kroneckerProduct(A.col(j)); } FullPivLU<MatrixXd> luDecomp(K); VectorXd vec_x(np); if(luDecomp.kernel().cols()>0){ cout << "Found solutions:" << endl; vec_x = luDecomp.kernel(); // 进一步处理得到的结果... } else{ cerr << "No nontrivial solution found."<<endl; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值