用MATLAB求解矩阵方程组?
我有一个由三个方程组成的系统,我想通过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
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我还不太擅长线性代数。“我迫不及待地想看看像这样的东西,看看你看到了什么。”特里曼,我的荣幸!我希望你没有被线性代数公式弄糊涂。不知道你对那些东西了解多少。祝你好运这管用!我感谢你的帮助!我还不太擅长线性代数。“我迫不及待地想看看像这样的东西,看看你看到了什么。”特里曼,我的荣幸!我希望你没有被线性代数公式弄糊涂。不知道你对那些东西了解多少。祝你好运