使用MATLAB求解矩阵方程组?

Solving a system of matrix equations using MATLAB?

我有一个由三个方程组成的系统,我想通过MATLAB求解,但是我对如何执行此过程感到有些困惑。

我有三个方程式:

1
2
3
A = R*P1
B = R*P2
C = R*P3

A, B, CP1, P2P33x1矩阵,而R3x3矩阵。 对于所有三个方程式,R均相同。

我需要找到R,并得到A, B, CP's

我想使用fsolve,但是当变量是矩阵时,fsolve似乎不起作用。 您建议使用什么替代方法?

只需计算一些数字即可使用:

1
2
3
4
5
P1 = [1;1;1];
P2 = [2;3;4];
P3 = [5;4;3];

R = [2 4 5; 1 5 4; 1 2 3];

这意味着:

1
2
3
A = [11;10;6];
B = [36;33;20];
C = [41;37;22];


如果A, B, C, P1, P2, P3都是数字,为什么不简单地使用ldivide\运算符?这将允许您直接求解线性系统。我可以看到您具有以下关系:

1
2
3
R*P1 = A
R*P2 = B
R*P3 = C

您可以看到每个矩阵方程产生三个约束。您可以做的是创建一个将所有矩阵方程式封装在一起的系统,从而产生9个约束。因此,您需要重新设置它以便能够不同地求解矩阵R中的系数。为此,我们需要调整矩阵R的形状,使其变为9元素向量。换句话说,我们可以像下面这样重新格式化您的系统:

1
2
3
4
5
6
7
8
9
10
11
[P1 0 0 0 0 0 0]    [R1]   [     ]
[0 0 0 P1 0 0 0]    [R2]   [  A  ]
[0 0 0 0 0 0 P1]    [R3]   [     ]
[P2 0 0 0 0 0 0]    [R4]   [     ]
[0 0 0 P2 0 0 0]  * [R5] = [  B  ]
[0 0 0 0 0 0 P2]    [R6]   [     ]    
[P3 0 0 0 0 0 0]    [R7]   [     ]
[0 0 0 P3 0 0 0]    [R8]   [  C  ]
[0 0 0 0 0 0 P3]    [R9]   [     ]

     P           *   R   =    D

您会看到我们有一个名为P的9 x 9矩阵,该矩阵R被重塑为一个向量,以便我们可以求解系数,并且DA,B,C串联在一起成为一个向量。 R1R9是从左至右和从上至下读取的矩阵R的系数。

因此,要在矩阵中找到系数,只需执行以下操作:

1
R = P^{-1}*D

这样,只需构造矩阵P和向量D,如下所示:

1
2
3
4
5
P = [P1.' zeros(1,6); zeros(1,3) P1.' zeros(1,3); zeros(1,6) P1.'; ...
P2.' zeros(1,6); zeros(1,3) P2.' zeros(1,3); zeros(1,6) P2.'; ...
P3.' zeros(1,6); zeros(1,3) P3.' zeros(1,3); zeros(1,6) P3.'];

D = [A; B; C];

现在,只需求解R并将其重塑为3 x 3矩阵。因此:

1
2
R = P \ D;
R = reshape(R, 3, 3).';

reshape将向量转换为3 x 3的矩阵,但是它以列主格式构造矩阵,因此您需要在调用reshape之后转置结果。通过您的示例,这就是我们所得到的。我构造了P1, P2, P3, A, B, C,然后使用之前的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
P1 = [1;1;1];
P2 = [2;3;4];
P3 = [5;4;3];

A = [11;10;6];
B = [36;33;20];
C = [41;37;22];

P = [P1.' zeros(1,6); zeros(1,3) P1.' zeros(1,3); zeros(1,6) P1.'; ...
P2.' zeros(1,6); zeros(1,3) P2.' zeros(1,3); zeros(1,6) P2.'; ...
P3.' zeros(1,6); zeros(1,3) P3.' zeros(1,3); zeros(1,6) P3.'];

D = [A; B; C];

R = P \ D;
R = reshape(R, 3, 3).';

要验证R是正确的,请执行以下操作:

1
2
3
A1 = R*P1;
B1 = R*P2;
C1 = R*P3;

我们得到每个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A1 =

    11
    10
     6

B1 =

    36
    33
    20

C1 =

    41
    37
    22

这与您的示例相符。但是,请注意,您可能会收到R状况不佳的警告。这是因为您可能没有足够的约束来正确地找到唯一的逆。您可能必须添加更多约束才能获得唯一的逆,但如果不能,则请谨慎使用。


您是否尝试展平solve函数内部的矩阵? MATLAB中有一个collect函数来收集系数,但是您需要检查它是否可以提供行矩阵而不是总和。 (也许是sum(行矩阵)-如果它也结合了类似的术语)

就像是:

1
[x,y,x] = solve(sum(R*P1)==A, sum(R*P2)==B, sum(R*P3)==C, x,y,z)

fsolve函数