СЛАУ метод простых итераций - 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
будет содержать приближённые значения переменных системы линейных уравнений.
- В результате работы программы переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д