Автор работы: Пользователь скрыл имя, 24 Декабря 2009 в 06:42, Не определен
Метод Зейделя – один из многочисленных итерационных способов решения систем линейных алгебраических уравнений. Все итерационные методы отличаются от обычных методов тем, что они вычисляют значение приблизительно. Метод Зейделя основывается на методе Гаусса. В некоторых источниках он так и называется Гаусса - Зейделя. Важным условием для использования данных методов является условие сходимости итерационных процессов. Для истинности данных условий используются проверки “норм”
Метод Зейделя – один из многочисленных итерационных способов решения систем линейных алгебраических уравнений. Все итерационные методы отличаются от обычных методов тем, что они вычисляют значение приблизительно. Метод Зейделя основывается на методе Гаусса. В некоторых источниках он так и называется Гаусса - Зейделя. Важным условием для использования данных методов является условие сходимости итерационных процессов. Для истинности данных условий используются проверки “норм”.
Суть данного метода заключается в следующем: составляем матрицу из элементов уравнений. Выражаем элементы на главной диагонали через элементы строки. Выбираем начальные приближения для решений. Путем итераций, эти значения будут приближены к истинным с разницей в заданную погрешность. Далее, имея выражения для всех неизвестных и начальные приближения, считаем все значения неизвестных. Для метода Гаусса, рассчитываем значения неизвестных используя приближения на предыдущем шаге. Для метода Зейделя, рассчитываем значения на очередном шаге используя значения, полученные на прошлом шаге, плюс значения полученные на данном шаге. Действия выполняются до тех пор, пока разница между шагами будет меньше заданной погрешности.
Текст программы с комментариями:
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<alloc.h>
int Zeidel(double *a, double *b, double *c, double pogr, int m){
int k,t,i,j,h,temp; /*Проверка сходимости */
t=0; /* итерационного процесса */
for (i=0;i<m;i++) /*если процесс не сходится */
{ /*возвращается -1 */
for(j=0;j<m;j++) {
k=(*(a+i*m));
if (abs(*(a+i*m+j)>k)) k=(abs(*(a+i*m+j)));
if (k!=abs(*(a+i*m+i))) t++;}
if (t>0){ printf("\nИтерационный процесс не сходится\n"); return(-1);}
else
printf("\nИтерационный
for(i=0;i<m;i++) /*
for(j=0;j<m;j++){ /*к виду, удобному для */
if ((i!=j)&&(i>j)){ h=(*(a+i*m+j)); h=h*(-1); (*(b+i*m+j+1))=h;}
if ((i!=j)&&(i<j)){ h=(*(a+i*m+j)); h=h*(-1); (*(b+i*m+j))=h;}}
for (i=0;i<m;i++) /*вычисления решения */
for (j=0;j<m;j++) /* Необязательная часть */
(*(b+i*m+j))=(*(b+i*m+j)/(*
while (1){
for
(i=0;i<m;i++){ /*
for (j=0;j<m;j++){ /*вычисления решения */
t=(*(b+i*m)); /*Для решений после i-того */
for(k=i+1;k<m;k++){t+=(*(c+
for(k=i-1;k>0;k--){t+=(*(c+
(*(c+m+k))=t;}
temp=0;
for(i=0;i<m;i++)
if((abs((*(c+m+i))-(*(c+i))))<
if (temp==m) return(0);
for(i=0;i<m;i++) (*(c+m+i))=(*(c+i));
}}
void main(void) {
int i,j,m;
double *a,*b,*c,temp,pogr,h;
clrscr();
printf("Введите количество строк и столбцов \n"); /*Ввод начальных условий */
scanf("%d",&m); /*Кол-
printf("Введите
погрешность \n"); /*
scanf("%lf",&pogr);
a=(double
*)farmalloc(m*m*sizeof(double)
if (a==NULL){ /*Процесс выделения */
printf("Нет памяти"); /*памяти под матрицы */
goto exit;}
b=(double
*)farmalloc(m*m*sizeof(double)
if (b==NULL)
{
printf("Нет памяти");
farfree(a);
goto exit;
}
c=(double *)farmalloc(m*2);
if (c==NULL)
{
printf("Нет памяти");
farfree(a);
farfree(b);
goto exit;
}
printf("\nВведите элементы матрицы\n");/*Процесс ввода матричных значений*/
for (i=0;i<m;i++) /*элементы уравнений */
for (j=0;j<m;j++){
printf("a[%d][%d] ",i,j);
scanf("%lf",&temp);
(*(a+i*m+j))=temp;}
printf("\n
Введите элементы вектора
for (i=0;i<m;i++){ /*элементы свободных членов */
printf("b[%d][1] ",i);
scanf("%lf ",&temp);
(*(b+i*m))=temp;}
for (i=0;i<m;i++)
printf("%6.3lf
\n",(*(b+i*m)));
printf("\Введите начальные приближения \n");
for (i=0;i<m;i++){ /*элементы начальных приближений*/
printf("d[%d][1] ",i);
scanf("%lf",&temp);
(*(c+i))=temp;}
g=Zeidel(a,b,c,pogr,m); /
if (g==0) for (j=0;j<m;j++) /*вернет 0 (система решена) то решения*/
printf("\n%10.2f",*(c+j));
exit:
getch();
farfree(a); /*Процесс освобождения памяти */
farfree(b);
farfree(c);
}
Результат работы программы:
Используя задания из методического пособия , программа выдает результат, что итерационный процесс не сходится.
Используя исходные данные
Программа
выдает результат X=
.
Блок схема программы:
Информация о работе Turbo с решение системы уравнений методом Зейделя.