(来自讲义参考)为了使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中做到这一点?
答案 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
函数来提取列。)