求解未知数多于方程的方程
Solving equations with more unknowns than equations
我正在尝试找出几个方程的未知数,但未知数比方程数多。代码是这样的:
syms x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17
eqn1 = 0.04*x1 + 0.04*x2 + 0.2*x3 + 0.2*x4 + 2*x5 + 0.2*x6 + 0.2*x7 + 0.04*x8 + 0.04*x9 == 111;
eqn2 = 0.04*x2 + 0.04*x3 + 0.2*x4 + 0.2*x5 + 2*x6 + 0.2*x7 + 0.2*x8 + 0.04*x9 + 0.04*x10 == 73;
eqn3 = 0.04*x3 + 0.04*x4 + 0.2*x5 + 0.2*x6 + 2*x7 + 0.2*x8 + 0.2*x9 + 0.04*x10 + 0.04*x11 == 40;
eqn4 = 0.04*x4 + 0.04*x5 + 0.2*x6 + 0.2*x7 + 2*x8 + 0.2*x9 + 0.2*x10 + 0.04*x11 + 0.04*x12 == 14;
eqn5 = 0.04*x5 + 0.04*x6 + 0.2*x7 + 0.2*x8 + 2*x9 + 0.2*x10 + 0.2*x11 + 0.04*x12 + 0.04*x13 == 0;
eqn6 = 0.04*x6 + 0.04*x7 + 0.2*x8 + 0.2*x9 + 2*x10 + 0.2*11 + 0.2*x12 + 0.04*x13 + 0.04*x14 == 191;
eqn7 = 0.04*x7 + 0.04*x8 + 0.2*x9 + 0.2*x10 + 2*x11 + 0.2*x12 + 0.2*x13 + 0.04*x14 + 0.04*x15 == 153;
eqn8 = 0.04*x8 + 0.04*x9 + 0.2*x10 + 0.2*x11 + 2*x12 + 0.2*x13 + 0.2*x14 + 0.04*x15 + 0.04*x16 == 362;
eqn9 = 0.04*x9 + 0.04*x10 + 0.2*x11 + 0.2*x12 + 2*x13 + 0.2*x14 + 0.2*x15 + 0.04*x16 + 0.04*x17 == 471;
[A,B] = equationsToMatrix([eqn1, eqn2, eqn3, eqn4, 5, eqn6, eqn7, eqn8, eqn9], [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17])
X = linsolve(A,B)
但是,我收到错误消息:
Warning: The system is inconsistent. Solution does not exist.
In symengine (line 57)
In sym/privBinaryOp (line 903)
In sym/linsolve (line 63)
In solveLinEqn (line 15)
X =
Inf
Inf
.
.
.
Inf
这是否意味着未知数有无数种解法?还有其他方法可以帮助解决这个问题吗?谢谢!
任何未知数多于方程的系统都会产生一个具有 (# unknowns - # equation) 个自由变量的欠定系统。
例如 1 个方程和 2 个未知数意味着有 1 个自由变量
y = 5x - 2
如果你在调用 linSolve(A,B)
之前看一下 <strong>A</strong>
矩阵,你会发现它有一个零行:
[ 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0, 0, 0]
[ 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 0, 1/5, 1/25, 1/25, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0]
[ 0, 0, 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25]
那是什么意思?
在我们深入研究欠定系统之前,让我们先回顾一下求解一组线性方程需要做什么。线性系统 <strong>Ax = b</strong>
的精确解需要 A
矩阵正方形,即相同的行数和列数,并且是可逆的。解决这样的系统需要 <strong>x = A<sup>-1</sup> * b</strong>
这是任何数值软件都可以做到的轻松紧缩。
鉴于您的系统未确定,即更多的未知数,它会生成一个矩阵,其中 A
中的列数大于行数,因此我们只能近似解决这种系统。欠定系统有无限多个解,所以让 x'
是系统 <strong>Ax' = b</strong>
现在得出 <strong>x' = A<sup>T</sup>w</strong>
对于某些向量 w
。那么我们可以将系统的解表示为
AA<sup>T</sup>w = b => w = (AA<sup>T</sup>)<sup>-1</sup>b
x' = A<sup>T</sup>w
<strong>AA<sup>T</sup></strong>
被称为格拉姆矩阵,如上所示,它必须是可逆的为了让系统有一个解决方案。由于您的 <strong>A</strong>
矩阵有一行零,因此格拉姆矩阵 <strong>AA<sup>T</sup></strong>
也有一行零,因此它是单数的(不可逆):
[ 2604/625, 562/625, 109/125, 32/125, 0, 4/125, 11/625, 2/625, 1/625]
[ 562/625, 2604/625, 562/625, 109/125, 0, 27/125, 4/125, 11/625, 2/625]
[ 109/125, 562/625, 2604/625, 562/625, 0, 31/125, 27/125, 4/125, 11/625]
[ 32/125, 109/125, 562/625, 2604/625, 0, 108/125, 32/125, 27/125, 4/125]
[ 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 4/125, 27/125, 31/125, 108/125, 0, 2579/625, 312/625, 104/125, 27/125]
[ 11/625, 4/125, 27/125, 32/125, 0, 312/625, 2604/625, 562/625, 109/125]
[ 2/625, 11/625, 4/125, 27/125, 0, 104/125, 562/625, 2604/625, 562/625]
[ 1/625, 2/625, 11/625, 4/125, 0, 27/125, 109/125, 562/625, 2604/625]
TL;DR; 你的格拉姆矩阵是不可逆的,因此系统没有解决方案(aka 作为一个不一致的系统),那就是为什么您会收到不一致的系统错误消息。
参考文献:
http://www.math.usm.edu/lambers/mat419/
我正在尝试找出几个方程的未知数,但未知数比方程数多。代码是这样的:
syms x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17
eqn1 = 0.04*x1 + 0.04*x2 + 0.2*x3 + 0.2*x4 + 2*x5 + 0.2*x6 + 0.2*x7 + 0.04*x8 + 0.04*x9 == 111;
eqn2 = 0.04*x2 + 0.04*x3 + 0.2*x4 + 0.2*x5 + 2*x6 + 0.2*x7 + 0.2*x8 + 0.04*x9 + 0.04*x10 == 73;
eqn3 = 0.04*x3 + 0.04*x4 + 0.2*x5 + 0.2*x6 + 2*x7 + 0.2*x8 + 0.2*x9 + 0.04*x10 + 0.04*x11 == 40;
eqn4 = 0.04*x4 + 0.04*x5 + 0.2*x6 + 0.2*x7 + 2*x8 + 0.2*x9 + 0.2*x10 + 0.04*x11 + 0.04*x12 == 14;
eqn5 = 0.04*x5 + 0.04*x6 + 0.2*x7 + 0.2*x8 + 2*x9 + 0.2*x10 + 0.2*x11 + 0.04*x12 + 0.04*x13 == 0;
eqn6 = 0.04*x6 + 0.04*x7 + 0.2*x8 + 0.2*x9 + 2*x10 + 0.2*11 + 0.2*x12 + 0.04*x13 + 0.04*x14 == 191;
eqn7 = 0.04*x7 + 0.04*x8 + 0.2*x9 + 0.2*x10 + 2*x11 + 0.2*x12 + 0.2*x13 + 0.04*x14 + 0.04*x15 == 153;
eqn8 = 0.04*x8 + 0.04*x9 + 0.2*x10 + 0.2*x11 + 2*x12 + 0.2*x13 + 0.2*x14 + 0.04*x15 + 0.04*x16 == 362;
eqn9 = 0.04*x9 + 0.04*x10 + 0.2*x11 + 0.2*x12 + 2*x13 + 0.2*x14 + 0.2*x15 + 0.04*x16 + 0.04*x17 == 471;
[A,B] = equationsToMatrix([eqn1, eqn2, eqn3, eqn4, 5, eqn6, eqn7, eqn8, eqn9], [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17])
X = linsolve(A,B)
但是,我收到错误消息:
Warning: The system is inconsistent. Solution does not exist.
In symengine (line 57)
In sym/privBinaryOp (line 903)
In sym/linsolve (line 63)
In solveLinEqn (line 15)
X =
Inf
Inf
.
.
.
Inf
这是否意味着未知数有无数种解法?还有其他方法可以帮助解决这个问题吗?谢谢!
任何未知数多于方程的系统都会产生一个具有 (# unknowns - # equation) 个自由变量的欠定系统。
例如 1 个方程和 2 个未知数意味着有 1 个自由变量
y = 5x - 2
如果你在调用 linSolve(A,B)
之前看一下 <strong>A</strong>
矩阵,你会发现它有一个零行:
[ 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0, 0, 0]
[ 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 0, 1/5, 1/25, 1/25, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25, 0]
[ 0, 0, 0, 0, 0, 0, 0, 0, 1/25, 1/25, 1/5, 1/5, 2, 1/5, 1/5, 1/25, 1/25]
那是什么意思?
在我们深入研究欠定系统之前,让我们先回顾一下求解一组线性方程需要做什么。线性系统 <strong>Ax = b</strong>
的精确解需要 A
矩阵正方形,即相同的行数和列数,并且是可逆的。解决这样的系统需要 <strong>x = A<sup>-1</sup> * b</strong>
这是任何数值软件都可以做到的轻松紧缩。
鉴于您的系统未确定,即更多的未知数,它会生成一个矩阵,其中 A
中的列数大于行数,因此我们只能近似解决这种系统。欠定系统有无限多个解,所以让 x'
是系统 <strong>Ax' = b</strong>
现在得出 <strong>x' = A<sup>T</sup>w</strong>
对于某些向量 w
。那么我们可以将系统的解表示为
AA<sup>T</sup>w = b => w = (AA<sup>T</sup>)<sup>-1</sup>b
x' = A<sup>T</sup>w
<strong>AA<sup>T</sup></strong>
被称为格拉姆矩阵,如上所示,它必须是可逆的为了让系统有一个解决方案。由于您的 <strong>A</strong>
矩阵有一行零,因此格拉姆矩阵 <strong>AA<sup>T</sup></strong>
也有一行零,因此它是单数的(不可逆):
[ 2604/625, 562/625, 109/125, 32/125, 0, 4/125, 11/625, 2/625, 1/625]
[ 562/625, 2604/625, 562/625, 109/125, 0, 27/125, 4/125, 11/625, 2/625]
[ 109/125, 562/625, 2604/625, 562/625, 0, 31/125, 27/125, 4/125, 11/625]
[ 32/125, 109/125, 562/625, 2604/625, 0, 108/125, 32/125, 27/125, 4/125]
[ 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 4/125, 27/125, 31/125, 108/125, 0, 2579/625, 312/625, 104/125, 27/125]
[ 11/625, 4/125, 27/125, 32/125, 0, 312/625, 2604/625, 562/625, 109/125]
[ 2/625, 11/625, 4/125, 27/125, 0, 104/125, 562/625, 2604/625, 562/625]
[ 1/625, 2/625, 11/625, 4/125, 0, 27/125, 109/125, 562/625, 2604/625]
TL;DR; 你的格拉姆矩阵是不可逆的,因此系统没有解决方案(aka 作为一个不一致的系统),那就是为什么您会收到不一致的系统错误消息。
参考文献:
http://www.math.usm.edu/lambers/mat419/