close

Вход

Забыли?

вход по аккаунту

?

laba04 (2)

код для вставкиСкачать
 МИНИНСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Полоцкий государственный университет
Кафедра технологий программирования
Лабораторная работа №4
по курсу "Численные методы в инженерных расчетах"
"Метод простых итераций"
Выполнил:
студент группы 11-ИТ-1
Гончарик Ю.В.
Полоцк, 2013 г.
МЕТОД ПРОСТОЙ ИТЕРАЦИИ
В методе простой итерации если аii ≠ 0, то исходная система может быть преобразована к виду хi = bi + aij хj , i ≠ j, т.е. из каждого уравнения последовательно выражают хi.
Здесь bi = Fi / аii; aij = - аij / аii.
Таким образом, в матричном виде имеем Х = В + AХ. Полученную систему будем решать методом последовательных приближений.
За нулевое приближение Х(0) можно принять матрицу В: Х(0)= = B, и далее, подставив найденные значения в исходную систему, получим Х (1) = В + A Х(0) .
При бесконечном повторении этой вычислительной схемы имеем
, где и будет искомое решение системы.
Если какая-либо норма матрицы A, согласованная с рассматриваемой нормой вектора Х, меньше единицы, то верна следующая оценка погрешности приближения в методе простой итерации:
. Листинг программы:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double proverka(double *A1, int n)
{
int i = 0, j = 0;
double norm = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
norm += (*A1)*(*A1);
A1++;
}
}
return sqrt(norm);
}
int main(int argc, char *argv[])
{
int n = 0;
printf("Size of matrix: ");
scanf("%d", &n);
printf("\n");
double A[n][n];
int i = 0, j = 0;
FILE *f1 = NULL, *f2 = NULL, *f3 = NULL;
f1 = fopen("1.txt", "w");
f2 = fopen("2.txt", "w");
f3 = fopen("3.txt", "w");
double tmp = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("A[%d][%d]: ", i,j);
scanf("%lf", &tmp);
if(i == j)
{
if(tmp == 0)
{
printf("Input error..\n");
return 1;
}
}
A[i][j] = tmp;
fprintf(f1, "%lf ", A[i][j]);
}
fprintf(f1, "%c", '\n');
}
printf("\n");
double B[n];
for(i = 0; i < n; i++)
{
printf("B[%d]: ", i);
scanf("%lf", &B[i]);
fprintf(f2, "%lf\n", B[i]);
}
printf("\n");
double A1[n][n];
double B1[n];
i = 0;
j = 0;
int k = 0;
for(i = 0; i < n; i++)
{
tmp = A[i][j+k];
for(j = 0; j < n; j++)
{
A1[i][j] = A[i][j]/tmp;
}
B1[i] = B[i]/tmp;
k++;
j = 0;
}
j = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(i == j)
A1[i][j] = 0;
A1[i][j] *= -1;
}
}
double e = 0;
printf("\n");
printf("The accuracy of calculation: ");
scanf("%lf", &e);
printf("\n");
double X[n];
double X1[n];
int fl = 0;
double xtmp[n];
int count = 1;
if(proverka(*A1, n) < 1)
{
for(i = 0; i < n; i++)
{
X[i] = B1[i];
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(i != j)
{
X1[i] += A1[i][j]*X[j];
}
else
{
X1[i] += X[j];
}
}
}
for(i = 0; i < n; i++)
{
xtmp[i] = X1[i] - X[i];
X[i] = X1[i];
X1[i] = 0;
}
tmp = proverka(xtmp, 1); //проверка сходимости
while(tmp > e)
{
count++;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(i != j)
{
X1[i] += A1[i][j]*X[j]; }
else
{
X1[i] += B1[j];
}
}
}
for(i = 0; i < n; i++)
{
xtmp[i] = X1[i] - X[i];
X[i] = X1[i];
X1[i] = 0;
}
tmp = proverka(xtmp, 1);
}
}
else
{
printf("The system has no solutions\n");
printf("\n");
fl = 1;
}
if(fl == 0)
{
printf("\n");
for(i = 0; i < n; i++)
{
printf("X[%d] = %8.5lf\n", (i+1), X[i]);
fprintf(f3, "%lf\n", X[i]);
}
printf("\n");
printf("The number of iterations: %d\n", count);
printf("\n");
}
return 0;
}
Пример работы программы:
При решении той же системы в MathCad, имеем следующие ответы:
Теперь можно вычислить погрешности.
Абсолютная:
X1* = |4.16237 - 4.164| = 0.00163
X2* = 0.87724 - 0.878 = 0.00076
X3* = 1.50940 - 1.51 = 0.0006
X4* = 0.95502 - 0.956 = 0.00098
Относительная:
для X1 = 0.00163/4.164*100 = 0.04%
для X2 = 0.00076/0.878*100 = 0.08%
для X3 = 0.0006/1.51*100 = 0.04%
для X4 = 0.00098/0.956*100 = 0.1%
Документ
Категория
Рефераты
Просмотров
11
Размер файла
48 Кб
Теги
laba04
1/--страниц
Пожаловаться на содержимое документа