СЛАУ метод простых итераций - C (СИ)
Формулировка задачи:
Матрица и вектор свободных членов даны по условию. Проверяем определитель, сходимость, делаем матрицу для итераций и новый вектор-столбец.
А результат таков( вместо 2, 3, 4), и погрешность неверная
Листинг программы
- #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;
- }
Решение задачи: «СЛАУ метод простых итераций»
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);
Объяснение кода листинга программы
В данном коде реализуется метод простых итераций для решения системы линейных уравнений.
- Переменные и их значения:
k
- счётчик, инициализируется нулём, используется для цикла;i
- счётчик, используется для цикла;j
- счётчик, используется для цикла;a
- массив коэффициентов перед x в уравнениях;x
- массив переменных, инициализируется значениями изa
;m
- матрица коэффициентов уравнений;d
- массив с приближёнными значениями переменных;e
- погрешность, задаётся как запятая, используется для проверки условия остановки.
- Циклы:
- Внешний цикл
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
.
- Внешний цикл
- Вычисления:
- Вычисляется значение переменной
temp
как сумма произведений элементов матрицыm
на соответствующие элементы массиваx
, умноженные на коэффициенты перед x в уравнениях; - Вычисляется значение переменной
d[i]
как отношение разности(-temp + m[i][i] * x[i])
наm[i][i]
; - Проверяется условие остановки: если разница между
x[k]
иd[k]
меньше заданной погрешностиe
, то счётчикk
увеличивается, иначе выполняется цикл смены значенийx
наd
.
- Вычисляется значение переменной
- Условие остановки:
- Условие остановки проверяется до тех пор, пока счётчик
k
меньше трёх, т.е. пока система не будет полностью решена.
- Условие остановки проверяется до тех пор, пока счётчик
- Результат:
- В результате работы программы переменная
x
будет содержать приближённые значения переменных системы линейных уравнений.
- В результате работы программы переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д