Turbo с решение системы уравнений методом Зейделя.

Автор работы: Пользователь скрыл имя, 24 Декабря 2009 в 06:42, Не определен

Описание работы

Метод Зейделя – один из многочисленных итерационных способов решения систем линейных алгебраических уравнений. Все итерационные методы отличаются от обычных методов тем, что они вычисляют значение приблизительно. Метод Зейделя основывается на методе Гаусса. В некоторых источниках он так и называется Гаусса - Зейделя. Важным условием для использования данных методов является условие сходимости итерационных процессов. Для истинности данных условий используются проверки “норм”

Файлы: 1 файл

Зейдель.doc

— 160.50 Кб (Скачать файл)
  1. Решить систему  линейных алгебраических уравнений  методом Зейделя.

  Метод Зейделя – один из многочисленных итерационных способов решения систем линейных алгебраических уравнений. Все  итерационные методы отличаются от обычных  методов тем, что они вычисляют  значение приблизительно. Метод Зейделя основывается на методе Гаусса. В некоторых источниках он так и называется Гаусса - Зейделя. Важным условием для использования данных методов является условие сходимости итерационных процессов. Для истинности данных условий используются проверки “норм”.

  Суть  данного метода заключается в  следующем: составляем матрицу из элементов  уравнений. Выражаем элементы на главной  диагонали через элементы строки. Выбираем начальные приближения для решений. Путем итераций, эти значения будут приближены к истинным с разницей в заданную погрешность. Далее, имея выражения для всех неизвестных и начальные приближения, считаем все значения неизвестных. Для метода Гаусса, рассчитываем значения неизвестных используя приближения на предыдущем шаге. Для метода Зейделя, рассчитываем значения на очередном шаге используя значения, полученные на прошлом шаге, плюс значения полученные на данном шаге. Действия выполняются до тех пор, пока разница между шагами будет меньше заданной погрешности.

  Текст программы с комментариями:

   #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Итерационный процесс сходится\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)/(*(a+i*m+i)));  /*программы   */ 

   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+k))*(*(b+i*m+k));} /*используем старые значения*/

   for(k=i-1;k>0;k--){t+=(*(c+m+k))*(*(b+i*m+k+1));}} /*Для решений до i-того    */

   (*(c+m+k))=t;}                 /*используем новые значения*/

   temp=0;

   for(i=0;i<m;i++) if((abs((*(c+m+i))-(*(c+i))))<pogr) temp++;

   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 Введите элементы вектора свободных  членов\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 с решение системы уравнений методом Зейделя.