【问题标题】:Matlab: how to display answers of underdetermined linear system as {a = r1, b = r1/2, c = r1} [closed]Matlab:如何将欠定线性系统的答案显示为 {a = r1, b = r1/2, c = r1} [关闭]
【发布时间】:2013-07-15 23:07:37
【问题描述】:

我有一个 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

或者类似于上面在线求解器表单的答案。我究竟做错了什么?提前致谢!

【问题讨论】:

  • 这个问题不属于SO,与编程无关。它确实属于一个基本的数学网站,在那里他们会解释这个问题不是未确定的,而是排名不足的。一个齐次的、有缺陷的 3x3 线性方程组。因此,有无限多的解决方案,其中一个是零解决方案。请注意,8 是原始矩阵的特征值。
  • 你好@woodchips!也许我表达得很糟糕,但至少在我看来,这是一个编程问题。我承认,这是一个非常基本的问题,但我尝试阅读大量材料,但无法得到答案。事实上,这是一个排名不足的问题,我对此不好,但我实际上理解了数学部分。我只是无法使用 Matlab 来达到与手动或通过我提到的网站 (wims.unice.fr/wims/en_tool~linear~linsolver.en.html) 解决的结果相同的结果,并且希望得到一些帮助以了解原因。我需要它来显示一个向量 v1=[a;b;c] ,其中 A*v1 = 8*v1。答案是 [2;1;2].Tks
  • 如果您确实了解数学,那么从命令“help eig”或“help null”开始。我认为您只了解方程组的基本概念,因此您实际上并不了解数学,因为您试图解决它。因此,这不是编程,而是数学问题。
  • 再一次,用笔和纸,我得到了答案,在上述网站上也是如此。据我所知,在 Matlab 中我以错误的方式进行,前提是它没有以预期的形式生成解决方案,我认为这里有人会帮助我找到一种在 Matlab 中执行类似过程的方法,即找到向量 v1= [a;b;c] 表示 A*v1=8*v1,不同于 [0;0;0],例如 [2;1;2]。我也知道我可能无法很好地表达我的怀疑,但这是我能做的最好的。不过,无论如何,谢谢,我会尝试在其他地方寻求帮助。

标签: matlab linear-equation


【解决方案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

在您了解所涉及的线性系统的数学之前,这真的不是一个编程问题,然后它本质上是一个解决问题的命令,所以仍然不是一个真正的编程问题。

【讨论】:

  • 非常感谢您的理解,@woodchips!如果这超出了 SO 的范围,我很抱歉,因为在那个站点它通过简单地放置矩阵提供了预期的答案,老实说,我认为这只是我无法弄清楚的 Matlab 语法问题;我在想有一些方法可以在 Matlab 上自动提供类似的答案。不过,我感谢您解释替代方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2017-10-22
相关资源
最近更新 更多