我有一个3x3矩阵,例如A=[3,2,4;2,0,2;4,2,3]
,我正在尝试以A*[a;b;c] = [8*a;8*b;8*c]
形式解决以下线性系统:
3 2 4 a 8a
2 0 2 * b = 8b
4 2 3 c 8c
好的,我有:
3a + 2b + 4c = 8a
2a + 2c = 8b
4a + 2b + 3c = 8c
它是不确定的,答案是[2;1;2]
事实上,如果我使用像this one这样的在线线性求解器,它会给我一个这样的答案:
{ a = r1, b = r1/2, c = r1 }
尽管如此,我还是找不到在Matlab中做到这一点的方法。如果我将B定义为B=[8*a;8*b;8*c]
并尝试A\B
,我会得到:
2*b - 4*a + 4*c
2*a - 7*b + 2*c
4*a + 2*b - 4*c
如果我将B定义为[8; 8; 8],我得到:
2
-3
2
虽然我期待:
2
1
2
或者类似上面在线求解器表单的回答。我究竟做错了什么?提前谢谢!
答案 0 :(得分:1)
哦,即使这不是编程问题,我也会回答。
问题是解决线性系统
Ax = 8x
其中给出3x3矩阵A,x是3x1未知向量。
A = [3 2 4;2 0 2;4 2 3];
[v,d] = eig(A)
v =
-0.4941 -0.5580 0.6667
-0.4720 0.8161 0.3333
0.7301 0.1500 0.6667
d =
-1.0000 0 0
0 -1.0000 0
0 0 8.0000
这里我们看到第三个特征值是8,所以确实存在一个非退化的问题解决方案。它的形式是
k*v(:,3)
因为v(:,3)是相应的特征向量。
format rat
v(:,3)
ans =
2/3
1/3
2/3
显然,这会导致提问者给出的解决方案。
我会注意到这一切都是有效的,因为问题是以A * x = lambda * x的形式提出的,所以这是一个经典的特征值问题。同样,如果你欣赏解决方案背后的数学,那么我们可以使用null解决问题:
null(A - 8*eye(3))
ans =
2/3
1/3
2/3
当然,我们可以使用符号工具箱。
sol = solve('3*a + 2*b + 4*c = 8*a','2*a + 2*c = 8*b','4*a + 2*b + 3*c = 8*c');
sol.a
ans =
z
sol.b
ans =
z/2
sol.c
ans =
z
假设问题是一个完全普遍的问题?因此,仍然是一个均匀的线性系统,但不是一个明显的特征值问题?作为一个例子,我将尝试解决任意线性问题
A*[a;b;c] = [a;2*b;3*c]
请注意,这不是以特征值问题的形式编写的。实际上有几种方法可以决定解决它。未知数是平等的两个方面。所以只需将它们全部移到左侧即可。在数学上,我们可能会这样做
B = A - diag([1 2 3])
B =
2 2 4
2 -2 2
4 2 0
我们现在尝试解决线性系统
Bx = B*[a;b;c] = [0;0;0]
存在解决方案吗?这一次,它们不存在,超越了琐碎的退化解决方案,因为B具有完全的排名。
rank(B)
ans =
3
满秩,均匀线性系统只有简并(零)解。 Null也告诉我们这一点。
null(B)
ans =
Empty matrix: 3-by-0
符号工具箱解决方案反映了这一事实。
sol = solve('3*a + 2*b + 4*c = a','2*a + 2*c = 2*b','4*a + 2*b + 3*c = 3*c')
sol.a
ans =
0
sol.b
ans =
0
sol.c
ans =
0
直到你理解所涉及的线性系统的数学,这真的不是一个编程问题,然后它本质上是一个解决问题的命令,所以仍然没有太多的编程问题。