2. ÐÀÇÁÎÐ ÌÅÒÎÄÀ ÐÅËÀÊÑÀÖÈÉ Â ÑÈÑÒÅÌÀÕ ËÈÍÅÉÍÛÕ ÓÐÀÂÍÅÍÈÉ ÍÀ ÏÐÈÌÅÐÅ
ПРИМЕР: решить методом релаксаций данную систему
(2.1) |
Вычисления производить с точностью до двух знаков после запятой.
РЕШЕНИЕ: Приводим систему(4) к виду, удобному для решения методом релаксации
(2.2) |
Задаем начальные приближения корней нулевыми значениями
(2.3) |
Находим значения невязок
0 | 0,60 | 0 | 0,70 | 0 | 0,80 |
0,16 | 0,16 | -0,80 | |||
0,76 | 0,86 | 0 | |||
0,17 | 0,86 | -0,86 | 0,09 | ||
0,93 | 0 | 0,09 | |||
0,93 | -0,93 | 0,09 | 0,09 | ||
0 | 0,09 | 0,18 | 0,18 | ||
0,04 | 0,04 | -0,18 | |||
0,04 | 0,13 | 0,13 | 0 | ||
0,03 | -0,13 | 0,01 | |||
0,07 | 0,07 | 0 | 0,01 | ||
-0,07 | 0,01 | 0,01 | |||
0 | 0,01 | 0,02 | 0,02 | ||
0 | 0 | -0,02 | |||
0 | |||||
0 | 0,01 | 0,01 | 0 | ||
0 | -0,01 | 0 | |||
0 | 0 | 0 | |||
1,00 | 1,00 | 1,00 |
Далее, решаем
И так далее. Подставляем результаты вычисленные в таблице. Подсчитав все приращения
, содержащее значение корнейДля проверки подставляем найденные значения корней в исходное уравнение; в целом система решена точно.
Рисунок 1 – Решение системы с помощью языка Borland C++
Листинг программы решающий систему методом релаксаций переменных приведен в приложении.
ЗАКЛЮЧЕНИЕ
Можно утверждать, что почти любая задача вычислительной математики сводится в конечном итоге к решению полученной некоторым образом системы линейных или тензорных алгебраических уравнений (СЛАУ).
Но такие системы уравнений могут быть, во-первых, очень большого размера, например, NxN=10000х10000, и даже более; во-вторых, система уравнений может оказаться недоопределенной; в-третьих, она может оказаться с линейно зависимыми уравнениями; в-четвертых, она может оказаться переопределённой и несовместной. Кроме того, в-пятых, вычислительная техника может иметь далеко не рекордное быстродействие и объём оперативной памяти, и заведомо конечную разрядность двоичного представления чисел и связанные с этим ненулевые вычислительные погрешности. Поэтому итерационные методы получили большое применение в решении СЛАУ. Современная вычислительная техника позволяет проводить исследование устойчивости и сходимости итерационного метода в зависимости от параметров задачи.
Наиболее эффективно метод релаксаций применяется при решении множества близких алгебраических систем линейных уравнений. На первом этапе проводится решение одной из систем с различными значениями итерационного параметраw и из анализа скорости сходимости итерационного процесса выбирается оптимальное значение этого параметра. Затем все остальные системы решаются с выбранным значением w.
Еще одно достоинство итерационного метода верхних релаксаций состоит в том, что при его реализации на ЭВМ алгоритм вычислений имеет простой вид и позволяет использовать всего один массив для неизвестного вектора.
Я научился решать систем линейных уравнений методом релаксации(ослабления) переменных, и закрепил приобретённые навыки разработкой программы на языке Borland C++ 4.5.
СПИСОК ЛИТЕРАТУРЫ
1. Воеводин В.В. «Вычислительные основы линейной алгебры». Москва «Наука», 1977.
2. Фаддеев Д.К., Фаддеева В.Н. «Вычислительные методы линейной алгебры». Москва «Физматгиз», 1963.
3. Самарский А.А., Гулин А.В.» Численные методы». Москва «Наука», 1989.
4. Самарский А.А., Николаев Е.С. «Методы решения сеточных уравнений». Москва «Наука», 1978.
5. Самарский А.А. «Введение в численные методы». Москва «Наука», 1987.
6. Стренг Г. «Линейная алгебра и ее применение». Москва «Мир», 1980.
7. Карманов В.Г. «Математическое программирование». Москва «Наука», 1989.
8. Алексеев Е.Р. «Программирование на С++». Москва «НТ Пресс», 2007.
9. http://www.exponenta.ru/ - сайт посвящен решению математических задач в прикладных программных пакетах.
10. Бахвалов Н.С., Жидков Н.П., Кобельков Г.М. Численные методы. - М.: Наука, 1987.- 600 с.
ПРИЛОЖЕНИЕ
Листинг программы
#include<iostream.h>
#include<math.h>
intmaximal(intn,doubleR0[]);
voidmain(){
inti,j,n,f,k,iter;
double S,det;
cout<<"Введите размерность матрицы(матрица должна быть квадратной)= ";cin>>n;
double *x=new double [n];
double **b=new double *[n];
for(i=0;i<n;i++)
b[i]=new double[n+1];
double **a=new double *[n];
for(i=0;i<n;i++)
a[i]=new double[n+1];
cout<<"Введите количество итераций:";
cin>>iter;
cout<<"Введите расширенную матрицу:\n";
for(i=0;i<n;i++){
for(j=0;j<=n;j++)
cin>>b[i][j];
}
cout<<"Подготавливаю матрицу к релаксации...\n";
for(i=0;i<n;i++){
for(j=0;j<n;j++)
a[i][j]=-b[i][j]/b[i][i];
a[i][n]=b[i][n]/b[i][i];
}
for(i=0;i<n;i++){
for(j=0;j<n+1;j++)
cout<<" "<<a[i][j]<<" || ";
cout<<"\n";
}
double *x0=new double [n];
for(i=0;i<n;i++)
x[i]=0.0;
double *R0=new double [n];
cout<<"Введите значения начальных приближений:\n";
for(i=0;i<n;i++)
cin>>x0[i];
S=0.0;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
S=S+a[i][j]*x0[i];
}
for(i=0;i<n;i++){
R0[i]=a[i][n]-x0[i]+S;
cout<<"R("<<i<<")="<<R0[i]<<" | ";
}
f=maximal(n,R0);
det=R0[f];
for(k=0;k<iter;k++){
cout<<"det{"<<k<<"}="<<det<<"\n";
for(i=0;i<n;i++){
if(i!=f) R0[i]=R0[i]+a[i][f]*det;
else R0[i]=R0[i]-det;
}
for(i=0;i<n;i++)
cout<<"R["<<i+1<<"]="<<R0[i]<<" ";
x[f]=x[f]+det;
f=maximal(n,R0);
det=R0[f];
}
cout<<"\n";
for(i=0;i<n;i++)
cout<<"X{"<<i+1<<"}="<<x[i]<<"\n";
delete []x;
delete []R0;
delete []x0;
delete []a;
}
int maximal(int n,double R0[]){
int i,f;
f=0.0;
for(i=0;i<n-1;i++){
if(R0[i+1]>R0[i]) f=i+1;
}
return f;
}