Matrix 如何使给定矩阵在极大值中对角占优

Matrix 如何使给定矩阵在极大值中对角占优,matrix,maxima,Matrix,Maxima,(来自讲义参考)为了使Gauss-Seidel和Jacobi方法收敛,有必要检查系数矩阵是否为对角占优,即对角元素在其列中的所有元素中应具有最大值如果它还不是对角占优的,则使用旋转。对于对角占优的矩阵,应满足以下条件:(这也称为收敛) 是否有任何预定义函数可以在maxima中使用以实现收敛,或者是否应该使用交换进行循环,以及应该使用哪些约束?假设矩阵的大小为3x3,元素为非零 我已经看到了一些相关的问题,但答案在matlab中 链接: 那么,如何在maxima中实现它呢?下面是一些实现您所描述内

(来自讲义参考)为了使Gauss-Seidel和Jacobi方法收敛,有必要检查系数矩阵是否为对角占优,即对角元素在其列中的所有元素中应具有最大值如果它还不是对角占优的,则使用旋转。对于对角占优的矩阵,应满足以下条件:(这也称为收敛)

是否有任何预定义函数可以在maxima中使用以实现收敛,或者是否应该使用交换进行循环,以及应该使用哪些约束?假设矩阵的大小为3x3,元素为非零

我已经看到了一些相关的问题,但答案在matlab中

链接:


那么,如何在maxima中实现它呢?

下面是一些实现您所描述内容的代码:

is_diag_dom_row (mat, i) :=
  is(2*abs(mat[i][i]) - lsum(abs(x), x, mat[i]) > 0)$

is_diag_dom (mat) :=
  every(lambda([i], is_diag_dom_row (mat, i)),
        makelist(i,i,length(mat)))$

swapped_matrix_rows (mat, i1, i2) :=
  makelist (
    mat[if is(i=i1) then i2 elseif is(i=i2) then i1 else i],
    i, makelist(i,i,length(mat)))$

row_swap (mat, i1, i2) := apply(matrix, swapped_matrix_rows(mat, i1, i2))$

为了便于编写,我将两个操作拆分为逻辑部分。添加一个额外的
mat[i][i]
副本意味着一个人可以在列表上进行求和,这比尝试为i求和要容易得多≠ J如果您想按列检查对角线优势,可能最简单的方法就是转置并按行检查,因为Maxima主要将矩阵视为行列表。(尽管有一个
col
函数可以在需要时提取列)。

下面是一些实现您所描述内容的代码:

is_diag_dom_row (mat, i) :=
  is(2*abs(mat[i][i]) - lsum(abs(x), x, mat[i]) > 0)$

is_diag_dom (mat) :=
  every(lambda([i], is_diag_dom_row (mat, i)),
        makelist(i,i,length(mat)))$

swapped_matrix_rows (mat, i1, i2) :=
  makelist (
    mat[if is(i=i1) then i2 elseif is(i=i2) then i1 else i],
    i, makelist(i,i,length(mat)))$

row_swap (mat, i1, i2) := apply(matrix, swapped_matrix_rows(mat, i1, i2))$

为了便于编写,我将两个操作拆分为逻辑部分。添加一个额外的
mat[i][i]
副本意味着一个人可以在列表上进行求和,这比尝试为i求和要容易得多≠ J如果您想按列检查对角线优势,可能最简单的方法就是转置并按行检查,因为Maxima主要将矩阵视为行列表。(虽然有一个
col
函数可以在需要时提取列)。

我应该说:Maxima中有一个稍微奇怪的情况,其中有些东西(比如
每个
函数)希望函数映射,而有些东西(比如
makelist
)希望表达式。我怀疑这与受Algol启发的Macsyma语言和编写实现的人的口齿不清之间的紧张关系有关。我想你只需要检查文档(或者尝试各种方法),直到你记住了哪个需要。我应该说:Maxima中有一个稍微奇怪的情况,有些东西(比如
每个
函数)期望函数映射,而有些东西(比如
makelist
)期望表达式。我怀疑这与受Algol启发的Macsyma语言和编写实现的人的口齿不清之间的紧张关系有关。我想你只需要检查文档(或者尝试每种方法),直到你记住了哪个需要哪个。