使用MATLAB求解矩阵方程组?

时间:2014-12-14 05:26:50

标签: matlab matrix equation differential-equations

我有一个由三个方程组成的系统,我想通过MATLAB解决,而且我对如何去做这个问题感到有些困惑。

我有三个方程式:

A = R*P1
B = R*P2
C = R*P3

A, B, CP1, P2P33x1矩阵,而R3x3矩阵。所有三个方程都R相同。

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

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

只需编写一些数字即可使用:

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

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

这意味着:

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

2 个答案:

答案 0 :(得分:4)

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

R*P1 = A
R*P2 = B
R*P3 = C

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

[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被重新整形为一个向量,以便我们可以求解系数{{1}将D连接在一起形成一个向量。 A,B,CR1是从左到右,从上到下读取的矩阵R9的系数。

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

R

因此,只需构建矩阵R = P^{-1}*D 和向量P,如下所示:

D

现在,只需求解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]; 并将其重新整形为3 x 3矩阵。因此:

R

R = P \ D; R = reshape(R, 3, 3).'; 将我们的矢量转换为3 x 3矩阵,但它以 - 主格式构造矩阵,因此您需要在调用{{1}后转置结果}。举个例子,这就是我们得到的。我构造reshape,然后使用我以前的代码:

reshape

要验证P1, P2, P3, A, B, C是否正确,请执行以下操作:

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

这与您的示例相符。但请注意,您可能会收到A1 = R*P1; B1 = R*P2; C1 = R*P3; 病态警告的警告。这是因为您可能没有足够的约束来正确查找唯一的逆。您可能需要添加更多约束才能获得唯一的反转,但如果不能,则请谨慎使用。

答案 1 :(得分:0)

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

类似的东西:

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

fsolve函数