【问题标题】:How to make a given matrix to be diagonally dominant in Maxima如何使给定矩阵在Maxima中对角占优
【发布时间】:2012-08-25 06:14:10
【问题描述】:

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

//convergence 
abs(A[i][i]) > summation(abs(A[i][j]),j=1 to n) where j != i for all i...n
//swapping rows in a matrix for partial pivoting
A:rowswap(A,source_index,destination_index)

我可以在 ma​​xima 中使用任何预定义的函数来实现收敛,或者我应该使用交换进行循环吗?我应该使用哪些约束?假设矩阵的大小为 3x3,包含非零元素。

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

链接:Is there a function for checking whether a matrix is diagonally dominant (row dominance)

那么,我怎样才能做到最大值呢?

【问题讨论】:

    标签: matrix maxima


    【解决方案1】:

    这里有一些实现你描述的代码:

    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 中有一个稍微奇怪的情况,其中一些东西(比如 every 函数)期望函数映射,而一些东西(比如 makelist)期望一个表达式。我怀疑这与受 Algol 启发的 Macsyma 语言和编写实现的人的 lispyness 之间的紧张关系有关。我想你只需要检查文档(或尝试各种方式),直到你记住了哪个需要哪个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多