Advertisement
Pug_coder

Untitled

May 30th, 2023
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math"
  6. )
  7.  
  8. const (
  9. alpha = 2.6 // change
  10. beta
  11. eps = 0.01
  12. )
  13.  
  14. func getF(A [][]float64) [][]float64 {
  15. var F [][]float64
  16. for i := 0; i < len(A); i++ {
  17. var temp []float64
  18. for j := 0; j < len(A[i]); j++ {
  19. if i == j {
  20. temp = append(temp, 0.0)
  21. } else {
  22. temp = append(temp, (-1 * A[i][j] / A[i][i]))
  23. }
  24. }
  25. F = append(F, temp)
  26. }
  27. return F
  28. }
  29. func getc(b []float64) []float64 {
  30. var c []float64
  31. for i := 0; i < len(b); i++ {
  32. c = append(c, b[i]/alpha)
  33. }
  34. return c
  35. }
  36. func norm(F [][]float64) float64 {
  37. var max float64
  38. for i := 0; i < len(F); i++ {
  39. temp := 0.0
  40. for j := 0; j < len(F[i]); j++ {
  41. temp += math.Abs(F[i][j])
  42. }
  43. if i == 0 && temp < 1 {
  44. max = temp
  45. }
  46. if temp > max && temp < 1 {
  47. max = temp
  48. }
  49. }
  50. return max
  51. }
  52. func subvect(a, b []float64) []float64 {
  53. var res []float64
  54. for i := 0; i < len(a); i++ {
  55. res = append(res, a[i]-b[i])
  56. }
  57. return res
  58. }
  59. func sumvect(a, b []float64) []float64 {
  60. var res []float64
  61. for i := 0; i < len(a); i++ {
  62. res = append(res, a[i]+b[i])
  63. }
  64. return res
  65. }
  66. func normvect(in []float64) float64 {
  67. max := math.Abs(in[0])
  68. for i := 1; i < len(in); i++ {
  69. if math.Abs(in[i]) > max {
  70. max = math.Abs(in[i])
  71. }
  72. }
  73. return math.Abs(max)
  74. }
  75. func absolut(F [][]float64, xk, xk1 []float64) float64 {
  76. normF := norm(F)
  77. normX := normvect(subvect(xk, xk1))
  78. res := normF / (1 - normF) * normX
  79. return res
  80. }
  81. func otnos(absoluth float64, xk []float64) float64 {
  82. return absoluth / normvect(xk)
  83. }
  84. func pogr(x1, x2 []float64) float64 {
  85. normX := normvect(subvect(x1, x2))
  86. return normX
  87. }
  88. func mul_m(A [][]float64, x []float64) []float64 {
  89. var out []float64
  90. for i := 0; i < len(A); i++ {
  91. out = append(out, 0)
  92. for j := 0; j < len(A[i]); j++ {
  93. out[i] += A[i][j] * x[j]
  94. }
  95. }
  96. return out
  97. }
  98. func main() {
  99.  
  100. A := [][]float64{{10.0 + alpha, -1.0, 0.2, 2.0},
  101. {1.0, 12.0 - alpha, -2.0, 0.1},
  102. {0.3, -4.0, 12.0 - alpha, 1.0},
  103. {0.2, -0.3, -0.5, 8.0 - alpha}}
  104. b := []float64{1.0 + beta, 2.0 - beta, 3.0, 1.0}
  105. F := getF(A)
  106. c := getc(b)
  107. var x [][]float64
  108. x = append(x, c)
  109.  
  110. fmt.Println("F", F)
  111. fmt.Println("c", c)
  112. fmt.Println("|F|", norm(F))
  113. z:=0
  114. for {
  115. var tempX []float64
  116. for i := 0; i < 4; i++ {
  117. sumf := 0.0
  118. for j := 0; j < 4; j++ {
  119. sumf += F[i][j] * x[len(x)-1][j]
  120. }
  121. tempX = append(tempX, sumf+c[i])
  122. }
  123. x = append(x, tempX)
  124. abspogr := absolut(F, x[len(x)-1], x[len(x)-2])
  125. othospogr := otnos(abspogr, x[len(x)-1])
  126. fmt.Println("step",z)
  127. fmt.Println("absolute error", abspogr)
  128. fmt.Println("relative error", othospogr)
  129. if math.Abs(othospogr) < eps {
  130. break
  131. }
  132. z++
  133. // fmt.Println(x)
  134. }
  135.  
  136.  
  137. fmt.Println("Iterations", x[len(x)-1])
  138. //Z
  139. var xDop [][]float64
  140. xDop = append(xDop, c)
  141. for {
  142. var tempX []float64
  143. for i := 0; i < 4; i++ {
  144. sumf1 := 0.0
  145. for j := 0; j <= i-1; j++ {
  146. sumf1 += F[i][j] * tempX[j]
  147. }
  148.  
  149. sumf2 := 0.0
  150. for j := i; j < 4; j++ {
  151. sumf2 += F[i][j] * xDop[len(xDop)-1][j]
  152. }
  153. tempX = append(tempX, sumf1+sumf2+c[i])
  154. }
  155. xDop = append(xDop, tempX)
  156. //abspogr := absolut(F, xDop[len(xDop)-1], xDop[len(xDop)-2])
  157. //othospogr := otnos(abspogr, xDop[len(xDop)-1])
  158. //fmt.Println("absolut", abspogr)
  159. //fmt.Println("othos", othospogr)
  160. if pogr(xDop[len(xDop)-1], xDop[len(xDop)-2]) < eps {
  161. break
  162. }
  163. // fmt.Println(x)
  164. }
  165.  
  166. fmt.Println("Zeidel", xDop[len(xDop)-1])
  167.  
  168. fmt.Println(sumvect(mul_m(F, x[len(x)-1]), c))
  169. fmt.Println(sumvect(mul_m(F, xDop[len(xDop)-1]), c))
  170. }
  171.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement