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

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

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

Матрица и вектор свободных членов даны по условию. Проверяем определитель, сходимость, делаем матрицу для итераций и новый вектор-столбец.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    float m[3][3]={8,-6,1,3,9,-5,1,2,-7}, a[3]={16,7,-21},
    x[3], E[3][1], x0[3];
  long det;
  int i,j;
  float e=0.0001, n[3][3],d[3];
  printf("\nThe matrix is:\n");
  for(i=0;i<3;i++)
    {
      printf("\n");
       for(j=0;j<3;j++)
         printf("%.1f\t", m[i][j]);
    }
  printf("\n\nFree vector is:\n");
  for(i=0;i<3;i++)
    {
      printf("\n");
         printf("%.1f\t", a[i]);
    }
  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]*
  m[0][2])-(m[2][0]*m[1][1]*m[0][2]+m[0][0]*m[2][1]*m[1][2]+
  m[1][0]*m[0][1]*m[2][2]);
    if (det!=0)
      printf("\n\nDeterminant is %ld, the system has the single solution;", det);
    else printf("The system hasn't the single solution;");
  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])>
   m[2][0]+m[2][1]))
     printf("\n\nMethod is converging;");
  else printf("\n\nMethod is not converging;");
   for(i=0;i<3;i++)
       for(j=0;j<3;j++)
          {
            if (i==j) n[i][j]=0;
            else n[i][j]=m[i][j]/m[i][i];
            d[i]=a[i]/m[i][i];
          }
       printf("\n\nThe matrix for iterations is:\n");
       for(i=0;i<3;i++)
          {
             printf("\n");
              for(j=0;j<3;j++)
                printf("%.2f\t", n[i][j]);
           }
       printf("\n\nNew vector:\n");
    for(i=0;i<3;i++)
          {
             printf("\n");
                printf("%.2f", d[i]);
           }
for(i=0;i<3;i++) x0[i]=d[i];
  do
     {
      for(i=0;i<3;i++)
        x[i]=0;
          for(j=0;j<3;j++)
          {
              x[i]=x[i]+n[i][j]*x0[i];
          }
        x[i]=x[i]+d[i];
        E[i][j]=fabs(x[i]-x0[i]);
          for(i=0;i<3;i++)
              if (e<E[i][j])
                  e=E[i][j];
          
          printf("\n\npogreshnost'=%.2f",E[i][j]);
      }
        while(e>=0.0001);
    printf("\n\nResult:\n");
    for(i=0;i<3;i++)    
        printf("\n%.1f",x[i]);
      getch();
        return 0;
   }
А результат таков( вместо 2, 3, 4), и погрешность неверная

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

textual
Листинг программы
int k;
    for(int i=0; i<3; i++){
        x[i] = a[i];}
    do{
        for(int i=0; i<3; i++){
            double temp =- a[i];
            for(int j=0; j<3; j++){
                temp += m[i][j] * x[j];}
            d[i] = (-temp + m[i][i] * x[i]) / m[i][i];}
        k = 0;
        while((fabs(x[k] - d[k]) < e) && (k < 3)){
            k++;}
        for(int i=0; i<3; i++){
            x[i] = d[i];}
    }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
Похожие ответы