求解方程式比方程更多的未知数

时间:2016-05-31 01:24:50

标签: matlab equation-solving

我试图找到几个方程的未知数,但是有更多的未知数而不是方程数。代码是这样的:

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

这是否意味着未知数有无限多种解决方案?有没有其他方法来帮助解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:3)

任何具有比方程更多未知数的系统都会产生一个带有(#unknowns - #equation)自由变量的欠定系统。

作为示例,1个等式和2个未知数意味着有1个自由变量

y = 5x - 2

答案 1 :(得分:1)

如果您在致电A之前看一下linSolve(A,B)矩阵,您会发现它有一行零:

[    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]

那是什么意思?
在我们深入研究欠定系统之前,让我们回顾一下解决一组线性方程的问题。线性系统Ax = b的精确解决方案要求 A 矩阵为正方形,即相同数量的行和列,并且是可逆的。解决这样一个系统需要x = A-1 * b这是任何数字软件都可以轻松处理的问题。

鉴于你的系统不确定,即更多未知的方程,它会产生一个矩阵,其中 A 中的列数大于行数,因此我们只能近似这种系统的解决方案。一个未确定的系统有无数的解决方案,所以让 x' 成为系统的解决方案Ax' = b 现在,对于某些向量 x' = ATw w。然后我们可以将系统的解决方案表达为

AATw = b => w = (AAT)-1b
x' = ATw
AAT被称为Gramm矩阵,因为它可以在上面看到它必须是可逆的,以便系统有一个解决方案。由于您的A矩阵有一行零,因此Gramm矩阵AAT也会有一行零,因此它是单数(不可逆):

[ 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; 您的Gramm矩阵不可逆,因此系统没有解决方案(又名作为不一致的系统),这就是您收到不一致的系统错误消息的原因。
参考文献:
http://www.math.usm.edu/lambers/mat419/