【问题标题】:Trouble understanding how lusolve works无法理解 lusolve 的工作原理
【发布时间】:2017-01-05 16:27:36
【问题描述】:

我正在尝试使用来自mathjs 3.8.0lusolve function 来求解线性系统。但是,我在解释输入的返回结果时遇到了一些麻烦。

我将根据example from the docs进行解释:示例来源开始

var m = [[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]];

var x = math.lusolve(m, [-1, -1, -1, -1]);        // x = [[-1], [-0.5], [-1/3], [-0.25]]

到目前为止,一切都很好 - 这代表了系统

1a          = -1
   2b       = -1
      3c    = -1
         4d = -1

显然解决办法是

a = -1
b = -0.5
c = -1/3
d = -0.25

如原始示例的评论中所述。 实际返回值是一个数组,其值与输入向量的顺序相同,即[[-1], [-0.5], [-1/3], [-0.25]]

但是,现在我尝试切换到输入向量:

var m = [[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 0, 4], [0, 0, 3, 0]];

var x = math.lusolve(m, [-1, -1, -1, -1]);

我认为这应该代表系统

1a          = -1
   2b       = -1
         3d = -1
      4c    = -1

如果是这样,解决方案应该是

a = -1
b = -0.5
c = -0.25
d = -1/3

[[-1], [-0.5], [-0.25], [-1/3]] 在 JavaScript 中。

但是,此输入的函数的实际返回值仍然[[-1],[-0.5],[-1/3],[-0.25]],就像原始输入向量排序一样。

这是为什么呢?返回系数的排序与输入向量的排序如何匹配?

【问题讨论】:

  • 你给出的第二个例子写得不正确。给出的矩阵输入是[[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 0, 4], [0, 0, 3, 0]]。如果你然后使用[-1, -1, -1, -1] 来解决它,输入矩阵可以更改为[[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]] 与相同的[-1, -1, -1, -1]。因为是对角线,所以解是a=-1b=-1/2c=-1/3d=-1/4。你只有那个小错误:P
  • @stringparser:“写得不正确”是什么意思?我故意以这种方式重新排序输入向量,以检查我对输出的理解是否正确——显然不是。当然,在我的实际用例中,这些值不会被很好地四舍五入,也可能不会是对角线——正如我在下面写的,它们是 3D 场景中的任意向量。
  • 输入矩阵[[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 0, 4], [0, 0, 3, 0]]在第3行有一个4,在第3行有一个3,相反的写法。我想也应该是3c4d
  • 等等,我明白了……您将每个内部向量视为列,但它们似乎是行。也就是说,如果我将内部向量视为列,我会发现这 not 有什么意义。
  • 转到此处:mathjs.org/docs/datatypes/matrices.html#creation 您将看到示例矩阵math.matrix([[0, 1], [2, 3], [4, 5]]); /* Matrix, size [3, 2] */。所以它似乎是rows x columns。也就是说,每个内部向量都是一行而不是一列。

标签: javascript mathjs


【解决方案1】:

LU decomposition 方法返回上三角矩阵和下三角矩阵,然后可用于求解线性系统。这意味着矩阵将被重新排序以具有这种形状(对角线下方和上方的零)。

对于您提供的示例,您可以看到这是如何做的:

math.lup([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]])

请参阅math.lusolve 来源了解更多具体信息。

还要注意矩阵如何映射到向量

http://mathjs.org/docs/datatypes/matrices.html#creation

在那里你会看到一个示例矩阵

math.matrix([[0, 1], [2, 3], [4, 5]]); /* Matrix of size [3, 2] */

这意味着每个内部向量都是一行而不是一列。那就是:

[[0, 1], [2, 3], [4, 5]]

写成

0 1

2 3

4 5

【讨论】:

  • 好的,但是我怎样才能回到可用的结果呢?即我可以应用于我的输入向量的一组系数?如果我使用lup 显式分解矩阵,我会得到一个看起来很有希望的置换向量,但这仅适用于与原始输入向量排序相比仅对系数进行重新排序的情况。
  • 该方法将始终以[ [a], [b], [c], ... ] 的形式为您提供结果。 a, b, ... 的值可以从该列向量中提取。你的用例是什么?
  • 我的用例是我试图将 3D 场景中的向量分解为三个(非平行)向量的线性组合。我的问题尤其是在我的问题中显示的示例中,我不知道如何提取 abcd 的值,因为我不知道哪个是哪个.在我在问题结束时展示的特定示例中,排序似乎是[ [a], [b], [d], [c] ]
  • 查看我在问题下留下的评论。我认为只是那个小错字让你感到困惑。 lusolve 应始终按顺序返回解决方案,即 [ [a], [b], [c], ... ]
猜你喜欢
  • 2014-04-08
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多