我有一个由三个方程组成的系统,我想通过MATLAB解决,而且我对如何去做这个问题感到有些困惑。
我有三个方程式:
A = R*P1
B = R*P2
C = R*P3
A, B, C
,P1, P2
和P3
是3x1
矩阵,而R
是3x3
矩阵。所有三个方程都R
相同。
我需要找到R
,并获得A, B, C
和P'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];
答案 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,C
到R1
是从左到右,从上到下读取的矩阵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
函数