用MATLAB求解矩阵方程组?

用MATLAB求解矩阵方程组?,matlab,matrix,equation,differential-equations,Matlab,Matrix,Equation,Differential Equations,我有一个由三个方程组成的系统,我想通过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 我想使用fsolve,但当变量是矩阵时,fsolve似乎不起作用。您建议使用的替代方法是什么 只是编一些数字来处理: P1 = [1;1;1]; P2 = [2;3;4]; P3 = [5;4;3]; R = [2

我有一个由三个方程组成的系统,我想通过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

我想使用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];

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

比如:

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

或者fsolve函数

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

比如:

[x,y,x] = solve(sum(R*P1)==A, sum(R*P2)==B, sum(R*P3)==C, x,y,z)
或者fsolve函数

如果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
你会看到,我们有一个9 x 9的矩阵,叫做p,我们的矩阵R被重塑成一个向量,这样我们就可以解出系数,D是a,B,C连在一起的向量。R1到R9是从左到右和从上到下读取的矩阵R的系数

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

R = P^{-1}*D
因此,简单地构造矩阵p和向量D,如下所示:

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

R = P \ D;
R = reshape(R, 3, 3).';
整形将向量转换为3 x 3矩阵,但它以列主格式构造矩阵,因此在调用整形后需要转置结果。以你为例,这就是我们得到的。我构造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;
我们每个人都有:

A1 =

    11
    10
     6

B1 =

    36
    33
    20

C1 =

    41
    37
    22
这与您的示例相符。但是,请注意,您可能会收到一条警告,R是病态的。这是因为您可能没有足够的约束来正确地找到唯一的逆。您可能需要添加更多约束才能得到唯一的逆,但如果不能,请谨慎使用。

如果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
你会看到,我们有一个9 x 9的矩阵,叫做p,我们的矩阵R被重塑成一个向量,这样我们就可以解出系数,D是a,B,C连在一起的向量。R1到R9是从左到右和从上到下读取的矩阵R的系数

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

R = P^{-1}*D
因此,简单地构造矩阵p和向量D,如下所示:

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

R = P \ D;
R = reshape(R, 3, 3).';
整形将向量转换为3 x 3矩阵,但它以列主格式构造矩阵,因此在调用整形后需要转置结果。以你为例,这就是我们得到的。我构造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;
我们每个人都有:

A1 =

    11
    10
     6

B1 =

    36
    33
    20

C1 =

    41
    37
    22

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

这很有效!我感谢你的帮助
P我还不太擅长线性代数。“我迫不及待地想看看像这样的东西,看看你看到了什么。”特里曼,我的荣幸!我希望你没有被线性代数公式弄糊涂。不知道你对那些东西了解多少。祝你好运这管用!我感谢你的帮助!我还不太擅长线性代数。“我迫不及待地想看看像这样的东西,看看你看到了什么。”特里曼,我的荣幸!我希望你没有被线性代数公式弄糊涂。不知道你对那些东西了解多少。祝你好运