СЛАУ метод простых итераций - C (СИ)

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

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

Матрица и вектор свободных членов даны по условию. Проверяем определитель, сходимость, делаем матрицу для итераций и новый вектор-столбец.
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. float m[3][3]={8,-6,1,3,9,-5,1,2,-7}, a[3]={16,7,-21},
  8. x[3], E[3][1], x0[3];
  9. long det;
  10. int i,j;
  11. float e=0.0001, n[3][3],d[3];
  12. printf("\nThe matrix is:\n");
  13. for(i=0;i<3;i++)
  14. {
  15. printf("\n");
  16. for(j=0;j<3;j++)
  17. printf("%.1f\t", m[i][j]);
  18. }
  19. printf("\n\nFree vector is:\n");
  20. for(i=0;i<3;i++)
  21. {
  22. printf("\n");
  23. printf("%.1f\t", a[i]);
  24. }
  25. det=(m[0][0]*m[1][1]*m[2][2]+m[0][1]*m[1][2]*m[2][0]+m[1][0]*m[2][1]*
  26. m[0][2])-(m[2][0]*m[1][1]*m[0][2]+m[0][0]*m[2][1]*m[1][2]+
  27. m[1][0]*m[0][1]*m[2][2]);
  28. if (det!=0)
  29. printf("\n\nDeterminant is %ld, the system has the single solution;", det);
  30. else printf("The system hasn't the single solution;");
  31. if ((fabs(m[0][0])>m[0][1]+m[0][2])&&(fabs(m[1][1])>m[1][0]+m[1][2])&&(fabs(m[2][2])>
  32. m[2][0]+m[2][1]))
  33. printf("\n\nMethod is converging;");
  34. else printf("\n\nMethod is not converging;");
  35. for(i=0;i<3;i++)
  36. for(j=0;j<3;j++)
  37. {
  38. if (i==j) n[i][j]=0;
  39. else n[i][j]=m[i][j]/m[i][i];
  40. d[i]=a[i]/m[i][i];
  41. }
  42. printf("\n\nThe matrix for iterations is:\n");
  43. for(i=0;i<3;i++)
  44. {
  45. printf("\n");
  46. for(j=0;j<3;j++)
  47. printf("%.2f\t", n[i][j]);
  48. }
  49. printf("\n\nNew vector:\n");
  50. for(i=0;i<3;i++)
  51. {
  52. printf("\n");
  53. printf("%.2f", d[i]);
  54. }
  55. for(i=0;i<3;i++) x0[i]=d[i];
  56. do
  57. {
  58. for(i=0;i<3;i++)
  59. x[i]=0;
  60. for(j=0;j<3;j++)
  61. {
  62. x[i]=x[i]+n[i][j]*x0[i];
  63. }
  64. x[i]=x[i]+d[i];
  65. E[i][j]=fabs(x[i]-x0[i]);
  66. for(i=0;i<3;i++)
  67. if (e<E[i][j])
  68. e=E[i][j];
  69. printf("\n\npogreshnost'=%.2f",E[i][j]);
  70. }
  71. while(e>=0.0001);
  72. printf("\n\nResult:\n");
  73. for(i=0;i<3;i++)
  74. printf("\n%.1f",x[i]);
  75. getch();
  76. return 0;
  77. }
А результат таков( вместо 2, 3, 4), и погрешность неверная

Решение задачи: «СЛАУ метод простых итераций»

textual
Листинг программы
  1. int k;
  2.     for(int i=0; i<3; i++){
  3.         x[i] = a[i];}
  4.     do{
  5.         for(int i=0; i<3; i++){
  6.             double temp =- a[i];
  7.             for(int j=0; j<3; j++){
  8.                 temp += m[i][j] * x[j];}
  9.             d[i] = (-temp + m[i][i] * x[i]) / m[i][i];}
  10.         k = 0;
  11.         while((fabs(x[k] - d[k]) < e) && (k < 3)){
  12.             k++;}
  13.         for(int i=0; i<3; i++){
  14.             x[i] = d[i];}
  15.     }while(k != 3);

Объяснение кода листинга программы

В данном коде реализуется метод простых итераций для решения системы линейных уравнений.

  1. Переменные и их значения:
    • k - счётчик, инициализируется нулём, используется для цикла;
    • i - счётчик, используется для цикла;
    • j - счётчик, используется для цикла;
    • a - массив коэффициентов перед x в уравнениях;
    • x - массив переменных, инициализируется значениями из a;
    • m - матрица коэффициентов уравнений;
    • d - массив с приближёнными значениями переменных;
    • e - погрешность, задаётся как запятая, используется для проверки условия остановки.
  2. Циклы:
    • Внешний цикл for(int i=0; i<3; i++){...} выполняет итерационный процесс для каждого уравнения системы.
    • Внутренний цикл for(int j=0; j<3; j++){...} используется для вычисления значения переменной temp, которое будет использоваться в дальнейшем.
    • Ещё один внутренний цикл for(int i=0; i<3; i++){...} используется для вычисления значения переменной d[i].
    • Внутренний цикл while((fabs(x[k] - d[k]) < e) && (k < 3)){...} проверяет условие остановки.
    • Внутренный цикл for(int i=0; i<3; i++){...} используется для присваивания x значения d.
  3. Вычисления:
    • Вычисляется значение переменной temp как сумма произведений элементов матрицы m на соответствующие элементы массива x, умноженные на коэффициенты перед x в уравнениях;
    • Вычисляется значение переменной d[i] как отношение разности (-temp + m[i][i] * x[i]) на m[i][i];
    • Проверяется условие остановки: если разница между x[k] и d[k] меньше заданной погрешности e, то счётчик k увеличивается, иначе выполняется цикл смены значений x на d.
  4. Условие остановки:
    • Условие остановки проверяется до тех пор, пока счётчик k меньше трёх, т.е. пока система не будет полностью решена.
  5. Результат:
    • В результате работы программы переменная x будет содержать приближённые значения переменных системы линейных уравнений.

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


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

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

9   голосов , оценка 4 из 5

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

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

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