Автор работы: Пользователь скрыл имя, 22 Ноября 2011 в 23:45, контрольная работа
Цель работы:
Приобретение навыков решения систем линейных алгебраических уравнений итерационными методами.
1. Цель работы:
Приобретение
навыков решения систем линейных
алгебраических уравнений итерационными
методами.
2.
Описание стационарного
метода Зейделя:
Пусть дана система линейных алгебраических уравнений
Ax=b
с неособенной матрицей (det 0) . Предварительно необходимо привести эту систему к виду
x=Bx+
т.е. первое уравнение системы разрешили относительно x1 , второе – относительно x2 и т.д.
Предположим, что известно начальное приближение
х 0=(
к точному решению X*=( ) системы. Тогда все следующие приближения найдем по формулам
(1)
…………………………………………….
Как видно, каждое
из полученных приближений для неизвестных
немедленно вводится в вычисления и порядок
уравнений при итерациях сохраняется.
Для стационарного метода Зейделя верны следующие утверждения:
1) Итерационный процесс сходится при любом начальном приближении х 0
тогда и только тогда, когда все корни уравнения
по модулю
меньше 1.
2)
Итерационный процесс сходится
при любом начальном
если, если для матрицы В выполняется одно из неравенств:
а) ;
б)
.
3. Постановка задачи.
Найти с помощью стационарного метода Зейделя решение системы линейных уравнений с матричными элементами
и свободными членами
, где i, j=1,2,3,4,5, N=4, k=4. Допустимая погрешность
.
4.
Алгоритм решения.
Пусть исходная
система приведена к
I Задание начального приближения:
1. i=1,2,…,n, n-размерность системы
1.1 ; -элементы столбца
Бесконечный цикл:
II Запись текущего приближения в матрицу :
2. i=1,2,…,n, n-размерность системы
2.1 ;
III Реализация итерационного процесса в стационарном методе Зейделя по формулам (1):
3. i=1,2,…,n
3.1 y=0;
3.2 j=1,2,…,n
3.2.1 y= ; -элементы матрицы В.
3.3 ;
IV Проверка очередного найденного приближения на точность:
4. k=0;
5. i=1,2,…,n
5.1 если то k=k+1; z-заданная точность
6. если k=n то выход из бесконечного цикла.
5.
Листинг программы.
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<math.h>
using namespace std;
int i,j;
void main()
setlocale(LC_ALL ,"Russian");
void Amatrix(double**,double*,int n);
int k,m,n;
double **a,**uu,*b,*x,*ll;
double h=0,v;
n=5;
a=new double*[n];
for(i=0;i<n;i++)
a[i]=new double[n];
uu=new double*[n];
for(i=0;i<n;i++)
uu[i]=new double[n];
b=new double[n];
ll=new double[n];
x=new double[n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if
(i<j) a[i][j]=i+1+j+1-double(4)/doub
if (i==j) a[i][j]=i+1+j+1+1+4;
if (i>j) a[i][j]=i+1+j+1-0.8-4;
}
b[i]=3*(i+1)+2+4;
}
cout<<"\nРасширенная матрица A\n";
Amatrix(a,b,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
uu[i][j]=-a[i][j]/a[i][i];
else uu[i][j]=0;
}
ll[i]=b[i]/a[i][i];
}
cout<<"\nМатрица A' и столбец б(бета) в формуле x=A'*x+б\n";
Amatrix(uu,ll,n);
for(i=0;i<n;i++)
x[i]=ll[i];
for(;;)
{
for(i=0;i<n;i++)
b[i]=x[i];
for(i=0;i<n;i++)
{
h=0;
for(j=0;j<n;j++)
x[i]=h+ll[i];
}
k=0;
for(i=0;i<n;i++)
if(fabs(b[i]-x[i])<=v) k++;
if(k==n) break;
}
cout<<"\nРешение";
for(i=0;i<n;i++)
cout<<"\nx["<<i+1<<"]="<<x[i];
getch();
}
void Amatrix(double **a,double *b,int n)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%.6f ",a[i][j]);
printf("%.6f\n",b[i]);
}
}
6.
Результаты работы программы.