Matlab:如何将欠定线性系统的答案显示为{a = r1,b = r1 / 2,c = r1}

时间:2013-07-15 23:07:38

标签: matlab linear solver

我有一个3x3矩阵,例如A=[3,2,4;2,0,2;4,2,3],我正在尝试以A*[a;b;c] = [8*a;8*b;8*c]形式解决以下线性系统:

3 2 4   a   8a
2 0 2 * b = 8b
4 2 3   c   8c

好的,我有:

3a + 2b + 4c = 8a
2a +      2c = 8b
4a + 2b + 3c = 8c

它是不确定的,答案是[2;1;2]事实上,如果我使用像this one这样的在线线性求解器,它会给我一个这样的答案:

{ a = r1, b = r1/2, c = r1 }

尽管如此,我还是找不到在Matlab中做到这一点的方法。如果我将B定义为B=[8*a;8*b;8*c]并尝试A\B,我会得到:

 2*b - 4*a + 4*c
 2*a - 7*b + 2*c
 4*a + 2*b - 4*c

如果我将B定义为[8; 8; 8],我得到:

2
-3
2

虽然我期待:

2
1
2

或者类似上面在线求解器表单的回答。我究竟做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:1)

哦,即使这不是编程问题,我也会回答。

问题是解决线性系统

Ax = 8x

其中给出3x3矩阵A,x是3x1未知向量。

A = [3 2 4;2 0 2;4 2 3];
[v,d] = eig(A)
v =
   -0.4941   -0.5580    0.6667
   -0.4720    0.8161    0.3333
    0.7301    0.1500    0.6667

d =
   -1.0000         0         0
         0   -1.0000         0
         0         0    8.0000

这里我们看到第三个特征值是8,所以确实存在一个非退化的问题解决方案。它的形式是

k*v(:,3)

因为v(:,3)是相应的特征向量。

format rat
v(:,3)
ans =

       2/3     
       1/3     
       2/3     

显然,这会导致提问者给出的解决方案。

我会注意到这一切都是有效的,因为问题是以A * x = lambda * x的形式提出的,所以这是一个经典的特征值问题。同样,如果你欣赏解决方案背后的数学,那么我们可以使用null解决问题:

null(A - 8*eye(3))
ans =
       2/3     
       1/3     
       2/3     

当然,我们可以使用符号工具箱。

sol = solve('3*a + 2*b + 4*c = 8*a','2*a + 2*c = 8*b','4*a + 2*b + 3*c = 8*c');

sol.a
ans =
z

sol.b
ans =
z/2

sol.c
ans =
z

假设问题是一个完全普遍的问题?因此,仍然是一个均匀的线性系统,但不是一个明显的特征值问题?作为一个例子,我将尝试解决任意线性问题

A*[a;b;c] = [a;2*b;3*c]

请注意,这不是以特征值问题的形式编写的。实际上有几种方法可以决定解决它。未知数是平等的两个方面。所以只需将它们全部移到左侧即可。在数学上,我们可能会这样做

B = A - diag([1 2 3])
B =
       2              2              4       
       2             -2              2       
       4              2              0       

我们现在尝试解决线性系统

Bx = B*[a;b;c] = [0;0;0]

存在解决方案吗?这一次,它们不存在,超越了琐碎的退化解决方案,因为B具有完全的排名。

rank(B)
ans =
       3       

满秩,均匀线性系统只有简并(零)解。 Null也告诉我们这一点。

null(B)
ans =
   Empty matrix: 3-by-0

符号工具箱解决方案反映了这一事实。

sol = solve('3*a + 2*b + 4*c = a','2*a + 2*c = 2*b','4*a + 2*b + 3*c = 3*c')

sol.a
ans =
0

sol.b
ans =
0

sol.c
ans =
0

直到你理解所涉及的线性系统的数学,这真的不是一个编程问题,然后它本质上是一个解决问题的命令,所以仍然没有太多的编程问题。