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