Files
sjy01-image-proc/vendor/github.com/nuknal/goNum/LEs_JocobiIterate.go
2024-10-24 15:46:01 +08:00

91 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// LEs_JocobiIterate
/*
------------------------------------------------------
作者 : Black Ghost
日期 : 2018-11-22
版本 : 0.0.0
------------------------------------------------------
解n阶线性方程组的Jocobi迭代法简单迭代法
理论:
参考 李信真, 车刚明, 欧阳洁, 等. 计算方法. 西北工业大学
出版社, 2000, pp 61-68.
收敛的条件B为变化后的系数矩阵
1. 矩阵B的谱半径小于1或者
2. 矩阵B的1范数小于1或者
3. 矩阵B的无穷范数小于1或者
4. 系数矩阵A严格对角占优
------------------------------------------------------
输入 :
A 系数矩阵
b 常数值向量
tol 最大容许误差
n 最大迭代步数
输出 :
sol 解向量
err 解出标志false-未解出或达到步数上限;
true-全部解出
------------------------------------------------------
*/
package goNum
import (
"math"
)
// LEs_JocobiIterate 解n阶线性方程组的Jocobi迭代法简单迭代法
func LEs_JocobiIterate(A, b, x0 Matrix, tol float64, n int) ([]float64, bool) {
/*
解n阶线性方程组的Jocobi迭代法简单迭代法
输入 :
A 系数矩阵
b 常数值向量
tol 最大容许误差
n 最大迭代步数
输出 :
sol 解向量
err 解出标志false-未解出或达到步数上限;
true-全部解出
*/
B := ZeroMatrix(A.Rows, A.Columns)
g := ZeroMatrix(A.Rows, 1)
x1 := ZeroMatrix(A.Rows, 1)
sol := ZeroMatrix(A.Rows, 1)
var err bool = false
//方程组迭代化变换求得矩阵B
for i := 0; i < A.Rows; i++ {
for j := 0; j < A.Columns; j++ {
if j != i {
B.SetMatrix(i, j, -1.0*A.GetFromMatrix(i, j)/A.GetFromMatrix(i, i))
}
}
g.Data[i] = b.Data[i] / A.GetFromMatrix(i, i)
}
//判断B是否收敛
temp0, _ := Norm1(B)
temp1, _ := NormInf(B)
if (temp0 >= 1) || (temp1 >= 1) {
return sol.Data, err
}
//求解
for i := 0; i < n; i++ {
x1 = AddMatrix(DotPruduct(B, x0), g)
sol = SubMatrix(x1, x0)
max, _, _ := Max(sol.Data)
if math.Abs(max) < tol {
sol = x1
err = true
return sol.Data, err
}
for i0 := 0; i0 < x0.Rows; i0++ {
x0.Data[i0] = x1.Data[i0]
}
}
return make([]float64, A.Rows), err
}