如何使给定矩阵在千里马中对角占优势

时间:2012-08-25 06:14:10

标签: matrix maxima

(来自讲义参考)为了使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)

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

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

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

那么,我怎么能在maxima中做到这一点?

1 个答案:

答案 0 :(得分: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函数来提取列。)