在Matlab中减少包含未知常数的矩阵的行梯形

时间:2013-01-21 23:47:06

标签: matlab matrix symbolic-math

问题:

    >> syms('a', 'b', 'c');

    >>A =

    [ -2, 3,  1, a]
    [  1, 1, -1, b]
    [  0, 5, -1, c]

    >>rref(A)

    ans =

    [ 1, 0, -4/5, 0]
    [ 0, 1, -1/5, 0]
    [ 0, 0,    0, 1]

我遇到的问题是我需要的答案是b和c,所以我需要这样的东西:

    ans =
    [1, 0, 0, a+2b-c]
    [0, 1, 0, 3a-c]
    [0, 0, 1, a+b+c]

有没有办法让Matlab完成这项工作?

3 个答案:

答案 0 :(得分:3)

您只需要将问题转换为相关表单,以便正确使用rref,即代替:

[1, 0, 0, a+2b-c]
[0, 1, 0, 3a-c]
[0, 0, 1, a+b+c]

其中x,y,z形成单位矩阵块, 写:

 syms x y z
 D =
[ 1, 2, -1, x]
[ 3, 0, -1, y]
[ 1, 1,  1, z]

rref(D)
ans =
[ 1, 0, 0,     (3*y)/10 - x/10 + z/5]
[ 0, 1, 0,       (2*x)/5 - y/5 + z/5]
[ 0, 0, 1, (3*z)/5 - y/10 - (3*x)/10]

答案 1 :(得分:1)

你想要的消除矩阵给你rref(A)。

但是什么是rref(A)?

UpperTri = RREF(A)= [LastStep] ... [步骤3] [步骤2] [步骤1] * A。

这是一系列将A减少到上三角形或尽可能最好的三角形的步骤。

Matlab有,

[ 1, 0, -4/5, (3*b)/5 - a/5]
[ 0, 1, -1/5, a/5 + (2*b)/5]
[ 0, 0,    0,             1]

然后Matlab刚推出它,你就不再有步骤了。所以它看起来像:

    [ 1, 0, -4/5, 0]
    [ 0, 1, -1/5, 0]
    [ 0, 0,    0, 1]

如果您想要一系列步骤,您需要使用一系列步骤的消除矩阵,以便使用Identity矩阵记录它。而不是:

A = 
[ -2, 3,  1, a]
[  1, 1, -1, b]
[  0, 5, -1, c]

使用

>>  A = [ -2, 3,  1, 1 0 0; 1, 1, -1, 0 1 0;  0, 5, -1, 0 0 1]

A =

    -2     3     1     1     0     0
     1     1    -1     0     1     0
     0     5    -1     0     0     1

>> E=rref(A)

E =

    1.0000         0   -0.8000         0    1.0000   -0.2000
         0    1.0000   -0.2000         0         0    0.2000
         0         0         0    1.0000    2.0000   -1.0000

这就像[A] [I],Now [rref Steps matrix] * [A] [I] = [rref(A)] [rref Steps matrix]

现在E = [rref(A)] [rref步长矩阵] =

 E =

        1.0000         0   -0.8000         0    1.0000   -0.2000
             0    1.0000   -0.2000         0         0    0.2000
             0         0         0    1.0000    2.0000   -1.0000

通过检查E1 = [rref Steps matrix] =

E1 =

         0    1.0000   -0.2000
         0         0    0.2000
    1.0000    2.0000   -1.0000

所以现在:

E1 =

         0    1.0000   -0.2000
         0         0    0.2000
    1.0000    2.0000   -1.0000

>> B=[a;b;c;]

B =

 a
 b
 c

>> B1=E1*B

B1 =

     b - c/5
         c/5
 a + 2*b - c

检查:

A1 = [ -2, 3,  1, a; 1, 1, -1, b;  0, 5, -1, c]

A1 =

[ -2, 3,  1, a]
[  1, 1, -1, b]
[  0, 5, -1, c]

>> A2=E1*A1

A2 =

[ 1, 0, -4/5,     b - c/5]
[ 0, 1, -1/5,         c/5]
[ 0, 0,    0, a + 2*b - c]

注意a + 2b - c = 0,因此c = a + 2b,因此sub c,(c / 5)=((a + 2b)/ 5),(bc / 5)=(5b-( A + 2B))/ 5

因此

[(-a+3*b)/5; (a+2*b)/5; a + 2*b - c ]

答案 2 :(得分:0)

Matlab实际上为您的示例提供了正确的答案,这可能看起来令人惊讶,因为它不依赖于abc;如果你使用另一个例子,例如

B = [1, 2, a; 2, 1, b];
rref(B)

然后答案将取决于预期的ab


我在这里解释为什么A的缩减行梯形式确实是

[ 1, 0, -4/5, 0]
[ 0, 1, -1/5, 0]
[ 0, 0,    0, 1]

通过展示减少行的一些重要步骤。 Matlab以A开头,并将其缩小为

[ 1, 0, -4/5, (3*b)/5 - a/5]
[ 0, 1, -1/5, a/5 + (2*b)/5]
[ 0, 0,    0,   a + 2*b - c]

然后将最后一行除以(a + 2 * b - c)得到

[ 1, 0, -4/5, (3*b)/5 - a/5]
[ 0, 1, -1/5, a/5 + (2*b)/5]
[ 0, 0,    0,             1]

然后继续从它上面的行中减去该行以给出

[ 1, 0, -4/5, 0]
[ 0, 1, -1/5, 0]
[ 0, 0,    0, 1]

Matlab假设a + 2*b - c不等于零(尝试用c替换a + 2*b,然后rref(A)将给出不同的答案)。我知道没有办法强迫Matlab不要除a + 2*b - c,即让Matlab假设a + 2*b + c可能等于零。