1

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

//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 中。

链接:是否有检查矩阵是否对角占优(行占优)的功能

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

4

1 回答 1

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功能可以在需要时提取一列)。

于 2012-08-25T13:50:22.587 回答