问题:
>> 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完成这项工作?
答案 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实际上为您的示例提供了正确的答案,这可能看起来令人惊讶,因为它不依赖于a
,b
或c
;如果你使用另一个例子,例如
B = [1, 2, a; 2, 1, b];
rref(B)
然后答案将取决于预期的a
和b
。
我在这里解释为什么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
可能等于零。