Реализация метода Гаусса Зейделя - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток) Народ есть у кого реализация метода Гаусса-Зейделя на C#? Нашел на плюсах) только
Листинг программы
  1. //Метод Гаусса-Зейделя
  2. void __fastcall TMainForm1::Method_of_Gauss_Zeydel(void)
  3. {
  4. int Iter=0;
  5. double *X0_temp,*X0,*X1;
  6. double epsilon=0.1;
  7. X0_temp=new double[M];
  8. X0=new double[M];
  9. X1=new double[M];
  10. for(int i=0;i<M;i++) X0[i]=random(10)+1.0;
  11. double Rez=0;
  12. do
  13. {
  14. for(int i=0;i<M;i++)
  15. {
  16. Rez=B[i][0];
  17. for(int j=0;j<M;j++)
  18. {
  19. if(i!=j) Rez-=A[i][j]*X0[j];
  20. }
  21. X1[i]=(1.0/A[i][i])*Rez;
  22. X0_temp[i]=X0[i];
  23. X0[i]=X1[i];
  24. Rez=B[i][0];
  25. }
  26. Iter++;
  27. }
  28. while(fabs(X1[0]-X0_temp[0])>epsilon);
  29. for(int i=0;i<M;i++) X[i][0]=X1[i];
  30. delete [] X0_temp;
  31. delete [] X0;
  32. delete [] X1;
  33. }
Листинг программы
  1. /// <summary>
  2. /// Поиск решения СЛАУ методом Зейделя (итерационный метод)
  3. /// </summary>
  4. /// <param name="mm">Матрица задающая СЛАУ</param>
  5. /// <returns>Вектор решений</returns>
  6. public static Row Zeidel(Matrix mm)
  7. {
  8. Row x = new Row(mm.rowCount);
  9. for (int i = 0; i < mm.rowCount; i++)
  10. x[i] = mm[i, mm.colCount - 1];
  11. Row prev_x = new Row(mm.rowCount);
  12. bool tmp;
  13. int counter = 0;
  14. do
  15. {
  16. counter++;
  17. if (counter > 200)
  18. {
  19. for (int i = 0; i < mm.rowCount; i++)
  20. x[i] = double.NaN;
  21. MessageBox.Show("Произошло зацикливание");
  22. return x;
  23. }
  24. tmp = true;
  25. for (int i = 0; i < mm.rowCount; i++)
  26. {
  27. double var = 0;
  28. for (int j = 0; j < mm.rowCount; j++)
  29. if (i != j)
  30. var += mm[i, j] * x[j];
  31. prev_x[i] = x[i];
  32. x[i] = (mm[i, mm.colCount - 1] - var) / mm[i, i];
  33. tmp = tmp && (Math.Abs(prev_x[i] - x[i]) < Eps);
  34. }
  35. } while (!tmp);
  36. return x;
  37. }
Листинг программы
  1. /// <summary>
  2. /// Вычисление нормы матрицы ||D||1
  3. /// </summary>
  4. /// <param name="mm">Матрица задающая СЛАУ</param>
  5. /// <returns>Норма матрицы</returns>
  6. public static double MatrixNorma1(Matrix mm)
  7. {
  8. double max_sum = 0;
  9. for (int j = 0; j < mm.colCount - 1; j++)
  10. {
  11. double sum = 0;
  12. for (int i = 0; i < mm.rowCount; i++)
  13. if (i != j)
  14. sum += Math.Abs(mm[i, j] / mm[i,i]);
  15. max_sum = Math.Max(sum,max_sum);
  16. }
  17. return max_sum;
  18. }
Листинг программы
  1. /// <summary>
  2. /// Класс строки матрицы
  3. /// </summary>
  4. public class Row
  5. {
  6. /// <summary>
  7. /// Массив элементов
  8. /// </summary>
  9. private double[] m;
  10. /// <summary>
  11. /// Длина массива
  12. /// </summary>
  13. public int length;
  14. /// <summary>
  15. /// Конструктор
  16. /// </summary>
  17. /// <param name="length">Длина создаваемого массива</param>
  18. public Row(int length)
  19. {
  20. this.length = length;
  21. m = new double[length];
  22. }
  23. /// <summary>
  24. /// Делает копию класса и данных содержащихся в классе
  25. /// </summary>
  26. /// <returns>копия текущего класса</returns>
  27. public Row Clone()
  28. {
  29. Row tmp = new Row(m.Length);
  30. for (int i = 0; i < m.Length; i++)
  31. tmp[i] = m[i];
  32. return tmp;
  33. }
  34. /// <summary>
  35. /// производит обмен значений двух элементов массива
  36. /// </summary>
  37. /// <param name="i">индекс элемента массива</param>
  38. /// <param name="j">индекс элемента массива</param>
  39. public void Exchange(int i, int j)
  40. {
  41. double tmp = m[i];
  42. m[i] = m[j];
  43. m[j] = tmp;
  44. }
  45. public static Row operator *(double k, Row t)
  46. {
  47. Row tmp = t.Clone();
  48. for (int i = 0; i < tmp.length; i++)
  49. tmp[i] = k * tmp[i];
  50. return tmp;
  51. }
  52. public static Row operator /(Row t, double k)
  53. {
  54. Row tmp = t.Clone();
  55. for (int i = 0; i < tmp.length; i++)
  56. tmp[i] = tmp[i]/k;
  57. return tmp;
  58. }
  59. public static Row operator -(Row t1, Row t2)
  60. {
  61. Row tmp = t1.Clone();
  62. for (int i = 0; i < t1.length; i++)
  63. tmp[i] = t1[i] - t2[i];
  64. return tmp;
  65. }
  66. public static Row operator +(Row t1, Row t2)
  67. {
  68. Row tmp = t1.Clone();
  69. for (int i = 0; i < t1.length; i++)
  70. tmp[i] = t1[i] + t2[i];
  71. return tmp;
  72. }
  73. public double this[int i]
  74. {
  75. set
  76. {
  77. m[i] = value;
  78. }
  79. get
  80. {
  81. return m[i];
  82. }
  83. }
  84. public string ToString()
  85. {
  86. string s = "";
  87. for (int i = 0; i < length; i++)
  88. s += m[i].ToString("F") + " ";
  89. return s.Trim();
  90. }
  91. }
  92. /// <summary>
  93. /// Матрица заданного размера
  94. /// </summary>
  95. public class Matrix
  96. {
  97. /// <summary>
  98. /// Массив строк
  99. /// </summary>
  100. private Row[] rows;
  101. /// <summary>
  102. /// Количество строк
  103. /// </summary>
  104. public int rowCount;
  105. /// <summary>
  106. /// Количество столбцов
  107. /// </summary>
  108. public int colCount;
  109. public string ToString()
  110. {
  111. string s = "";
  112. for (int i = 0; i < rowCount; i++)
  113. s += rows[i].ToString() + " \r\n";
  114. return s.Trim();
  115. }
  116. /// <summary>
  117. /// Клонирует матрицу
  118. /// </summary>
  119. /// <returns>колнированная матрица</returns>
  120. public Matrix Clone()
  121. {
  122. Matrix tmp = new Matrix(colCount, rowCount);
  123. for (int i = 0; i < tmp.rowCount; i++)
  124. tmp[i] = rows[i].Clone();
  125. return tmp;
  126. }
  127. /// <summary>
  128. /// Конструктор
  129. /// </summary>
  130. /// <param name="colNum">число столбцов</param>
  131. /// <param name="rowNum">число строк</param>
  132. public Matrix(int colNum, int rowNum)
  133. {
  134. rows = new Row[rowNum];
  135. rowCount = rowNum;
  136. colCount = colNum;
  137. for (int i = 0; i < rowNum; i++)
  138. rows[i] = new Row(colNum);
  139. }
  140. /// <summary>
  141. /// Переставить строки местами
  142. /// </summary>
  143. /// <param name="i">номер первой строки</param>
  144. /// <param name="j">номер второй строки</param>
  145. public void ExchangeRows(int i, int j)
  146. {
  147. Row tmp = rows[i];
  148. rows[i] = rows[j];
  149. rows[j] = tmp;
  150. }
  151. /// <summary>
  152. /// Переставить колонки местами
  153. /// </summary>
  154. /// <param name="c1">номер первой колонки</param>
  155. /// <param name="c2">номер второй колонки</param>
  156. public void ExchangeColumns(int c1, int c2)
  157. {
  158. for (int i = 0; i < rowCount; i++)
  159. rows[i].Exchange(c1, c2);
  160. }
  161. /// <summary>
  162. /// Обращение к строке матрицы
  163. /// </summary>
  164. /// <param name="i">номер строки</param>
  165. /// <returns>строку матрицы</returns>
  166. public Row this[int i]
  167. {
  168. set
  169. {
  170. rows[i] = value;
  171. }
  172. get
  173. {
  174. return rows[i];
  175. }
  176. }
  177. /// <summary>
  178. /// Обращение к элементу матрицы
  179. /// </summary>
  180. /// <param name="i">
  181. /// номер строки в которой расположен элемент</param>
  182. /// <param name="j">
  183. /// номер столбца в которой расположен элемент</param>
  184. /// <returns>значение элемента матрицы</returns>
  185. public double this[int i, int j]
  186. {
  187. set
  188. {
  189. rows[i][j] = value;
  190. }
  191. get
  192. {
  193. return rows[i][j];
  194. }
  195. }
  196. }
Листинг программы
  1. /// <summary>
  2. /// Класс строки матрицы
  3. /// </summary>
  4. public class Row
  5. {
  6. /// <summary>
  7. /// Массив элементов
  8. /// </summary>
  9. private double[] m;
  10. /// <summary>
  11. /// Длина массива
  12. /// </summary>
  13. public int length;
  14. /// <summary>
  15. /// Конструктор
  16. /// </summary>
  17. /// <param name="length">Длина создаваемого массива</param>
  18. public Row(int length)
  19. {
  20. this.length = length;
  21. m = new double[length];
  22. }
  23. /// <summary>
  24. /// Делает копию класса и данных содержащихся в классе
  25. /// </summary>
  26. /// <returns>копия текущего класса</returns>
  27. public Row Clone()
  28. {
  29. Row tmp = new Row(m.Length);
  30. for (int i = 0; i < m.Length; i++)
  31. tmp[i] = m[i];
  32. return tmp;
  33. }
  34. /// <summary>
  35. /// производит обмен значений двух элементов массива
  36. /// </summary>
  37. /// <param name="i">индекс элемента массива</param>
  38. /// <param name="j">индекс элемента массива</param>
  39. public void Exchange(int i, int j)
  40. {
  41. double tmp = m[i];
  42. m[i] = m[j];
  43. m[j] = tmp;
  44. }
  45. public static Row operator *(double k, Row t)
  46. {
  47. Row tmp = t.Clone();
  48. for (int i = 0; i < tmp.length; i++)
  49. tmp[i] = k * tmp[i];
  50. return tmp;
  51. }
  52. public static Row operator /(Row t, double k)
  53. {
  54. Row tmp = t.Clone();
  55. for (int i = 0; i < tmp.length; i++)
  56. tmp[i] = tmp[i]/k;
  57. return tmp;
  58. }
  59. public static Row operator -(Row t1, Row t2)
  60. {
  61. Row tmp = t1.Clone();
  62. for (int i = 0; i < t1.length; i++)
  63. tmp[i] = t1[i] - t2[i];
  64. return tmp;
  65. }
  66. public static Row operator +(Row t1, Row t2)
  67. {
  68. Row tmp = t1.Clone();
  69. for (int i = 0; i < t1.length; i++)
  70. tmp[i] = t1[i] + t2[i];
  71. return tmp;
  72. }
  73. public double this[int i]
  74. {
  75. set
  76. {
  77. m[i] = value;
  78. }
  79. get
  80. {
  81. return m[i];
  82. }
  83. }
  84. public string ToString()
  85. {
  86. string s = "";
  87. for (int i = 0; i < length; i++)
  88. s += m[i].ToString("F") + " ";
  89. return s.Trim();
  90. }
  91. }
  92. /// <summary>
  93. /// Матрица заданного размера
  94. /// </summary>
  95. public class Matrix
  96. {
  97. /// <summary>
  98. /// Массив строк
  99. /// </summary>
  100. private Row[] rows;
  101. /// <summary>
  102. /// Количество строк
  103. /// </summary>
  104. public int rowCount;
  105. /// <summary>
  106. /// Количество столбцов
  107. /// </summary>
  108. public int colCount;
  109. public string ToString()
  110. {
  111. string s = "";
  112. for (int i = 0; i < rowCount; i++)
  113. s += rows[i].ToString() + " \r\n";
  114. return s.Trim();
  115. }
  116. /// <summary>
  117. /// Клонирует матрицу
  118. /// </summary>
  119. /// <returns>колнированная матрица</returns>
  120. public Matrix Clone()
  121. {
  122. Matrix tmp = new Matrix(colCount, rowCount);
  123. for (int i = 0; i < tmp.rowCount; i++)
  124. tmp[i] = rows[i].Clone();
  125. return tmp;
  126. }
  127. /// <summary>
  128. /// Конструктор
  129. /// </summary>
  130. /// <param name="colNum">число столбцов</param>
  131. /// <param name="rowNum">число строк</param>
  132. public Matrix(int colNum, int rowNum)
  133. {
  134. rows = new Row[rowNum];
  135. rowCount = rowNum;
  136. colCount = colNum;
  137. for (int i = 0; i < rowNum; i++)
  138. rows[i] = new Row(colNum);
  139. }
  140. /// <summary>
  141. /// Переставить строки местами
  142. /// </summary>
  143. /// <param name="i">номер первой строки</param>
  144. /// <param name="j">номер второй строки</param>
  145. public void ExchangeRows(int i, int j)
  146. {
  147. Row tmp = rows[i];
  148. rows[i] = rows[j];
  149. rows[j] = tmp;
  150. }
  151. /// <summary>
  152. /// Переставить колонки местами
  153. /// </summary>
  154. /// <param name="c1">номер первой колонки</param>
  155. /// <param name="c2">номер второй колонки</param>
  156. public void ExchangeColumns(int c1, int c2)
  157. {
  158. for (int i = 0; i < rowCount; i++)
  159. rows[i].Exchange(c1, c2);
  160. }
  161. /// <summary>
  162. /// Обращение к строке матрицы
  163. /// </summary>
  164. /// <param name="i">номер строки</param>
  165. /// <returns>строку матрицы</returns>
  166. public Row this[int i]
  167. {
  168. set
  169. {
  170. rows[i] = value;
  171. }
  172. get
  173. {
  174. return rows[i];
  175. }
  176. }
  177. /// <summary>
  178. /// Обращение к элементу матрицы
  179. /// </summary>
  180. /// <param name="i">
  181. /// номер строки в которой расположен элемент</param>
  182. /// <param name="j">
  183. /// номер столбца в которой расположен элемент</param>
  184. /// <returns>значение элемента матрицы</returns>
  185. public double this[int i, int j]
  186. {
  187. set
  188. {
  189. rows[i][j] = value;
  190. }
  191. get
  192. {
  193. return rows[i][j];
  194. }
  195. }
  196. }

Решение задачи: «Реализация метода Гаусса Зейделя»

textual
Листинг программы
  1. public class GaussZeidel
  2.     {
  3.             public static double epsilon = 0.01; //точность вычисления
  4.             public int n, k, N; //N -допустимое число итераций, n - размерность квадратной матрицы коэффицентов, k-количество итераций
  5.             public double s, Xi, diff = 1; //s - сумма, величина погрешности
  6.             public double[,] matrix; //матрица коэффицентов
  7.             public double[] value; //матрица значений
  8.             public double[] roots; //матрица корней
  9.             public bool diagonal;
  10.  
  11.             public GaussZeidel(double[,] matrix, double[] value, int N, int n, double[] roots)
  12.             {
  13.                 this.matrix = matrix;
  14.                 this.N = N;
  15.                 this.value = value;
  16.                 this.n = n;
  17.                 this.roots = roots;
  18.             }
  19.  
  20.             public bool DiagonallyDominant()
  21.             {
  22.                 for (int i = 0; i < n; i++ )
  23.                 {
  24.                     double sum = 0;
  25.                     for (int j=0; j < n; j++)
  26.                     {
  27.                         if (i !=j)
  28.                         {
  29.                             sum += Math.Abs(matrix[i, j]);
  30.                         }
  31.                     }
  32.                     if (Math.Abs(matrix[i,i])>=sum)
  33.                     {
  34.                         diagonal = true;
  35.                         break;
  36.                     }
  37.                     else
  38.                     {
  39.                         diagonal = false;
  40.                     }
  41.                 }
  42.                 return diagonal;
  43.             }
  44.  
  45.             public void algoritm()
  46.             {
  47.                 k = 0;
  48.                 while ((k <= N) && (diff >= epsilon))
  49.                 {
  50.                     k = k + 1;
  51.                     for (int i = 0; i < n; i++)
  52.                     {
  53.                         s = 0;
  54.                         for (int j = 0; j < n; j++)
  55.                         {
  56.                             if (i != j)
  57.                             {
  58.                                 s += matrix[i, j] * roots[j];
  59.                             }
  60.                         }
  61.                         Xi = (value[i] - s) / matrix[i, i];
  62.                         diff = Math.Abs(Xi - roots[i]);
  63.                         roots[i] = Xi;
  64.                     }
  65.                 }
  66.             }
  67.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.267 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы