Решение систем линейных алгебраических уравнений 2

Нижегородский Технический Университет

Институт Радиотехники и Информационных Технологий





Кафедра «Прикладная Математика и Информатика»























Отчёт по лабораторной работе №2

Тема: «Решение систем линейных алгебраических уравнений»































Выполнила: Волынкина В.М.

                                                                                                                        группа 04-ПМ

                                                                                               Проверила:  Катаева Л.Ю.





























Нижний Новгород

2008





Содержание.



1.Постанoвка задачи №1, метод решения.

2.Постановка задачи №2, метод решения.

3. Реализация на языке С++ задачи №1.

4. Реализация на языке С++ задачи №2.

5. Реализация на языке Fortran задачи №1.

6. Реализация на языке Fortran задачи №2.

7. Реализация в Matlab задачи №1.

8. Реализация в Matlab задачи №2. 

9. Вывод.

10.Список литературы.





















































































1.Постановка задачи №1. Метод решения.



Представить реализацию метода простой итерации для решения систем линейных алгебраических уравнений.



 Запишем исходную систему уравнений в векторно-матричном виде: Ax=F.

Пусть Е - заданное приближение.

Матрицу А всегда можно привести к виду, когда на диагонали находятся максимальные значения.  Только в этом случае итерационный метод применяют.

Приведение матрицы А  происходит путём нахождения в строке максимального элемента и перестановки этой строки на место той строки, номер которой совпадает с номером столбца максимального элемента.

Затем из каждого уравнения выражаем хi :  

Чтобы запустить итерационный процесс, необходимо задать начальные приближения значений неизвестных: хi(0)=0. 

Затем подставим нулевые значения переменных в правые части уравнений. Получим некоторые значения переменных хi: Будем рассматривать их в качестве следующего (первого) приближения хi(1). 

Проверим, удовлетворяют ли заданной точности получившиеся значения. Найдём модули разности  получившегося приближения и начального: !х(1)-х(0)! Если значения модулей больше заданного приближения, продолжаем итерационный процесс.

На следующем шаге подставляем в правые части формул х(1) приближения, получаем значения х(2) приближений, проверяем модули разности и т.д.

Итерационный процесс продолжается до тех пор, пока все значения х i(k) не станут близкими к xi(k+1), т.е. пока модули разности не станут меньше заданного приближения: !х(к+1)-х(к)!<Е.

























































2.Постановка задачи №2. Метод решения.



Представить реализацию метода Зейделя для решения систем линейных алгебраических уравнений.



 Запишем исходную систему уравнений в векторно-матричном виде: Ax=F.

Пусть Е - заданное приближение.

Приводим матрицу А к виду, когда на диагонали находятся максимальные значения.

(как в методе простой итерации).  

Затем из каждого уравнения выражаем хi :  

Чтобы запустить итерационный процесс, необходимо задать начальные приближения значений неизвестных: хi(0)=0.

 Затем подставим нулевые значения переменных в правую часть первого уравнения, т.е. в формулу для х1. В следующие формулы для хi будем подставлять значения переменных, найденные на этом же шаге. Например: формула 

Получившиеся значения переменных будем рассматривать как следующие приближения.

После каждого итерационного шага делаем проверку по принципу, описанному в методе простой итерации.









































































3. Реализация на языке С++ задачи №1.



#include <iostream>

using namespace std;

int main()

{

int c=0,n,p,z;

float l=0,t=0,E,max,r;

cout<<"kol-vo perem=";

cin>>n;

cout<<n<<endl;

float A[n][n],F[n], x[n],y[n],q[n];

for (int i=0; i<n; i++)

{

   for (int j=0;j<n;j++)

   {

      cout<<"A["<<i<<"]["<<j<<"]=";

      cin>>A[i][j];

   }

}

for (int i=0;i<n;i++) 

{	

	cout<<"F["<<i<<"]=";

	cin>>F[i];

}

cout<<"priblijenie=";

cin>>E;

cout<<E<<endl;

//---------------privedenie matrici--------------------------

for (int i=0;i<n;i++)

{	max=A[i][0]; 

		for (int j=0;j<n;j++)

		{	

		  if (max<A[i][j]) {max=A[i][j];p=i,z=j;}	

		}

	if (p!=z) {for (int j=0;j<n;j++) 							             		{

		  q[j]=A[z][j];

		  A[z][j]=A[p][j];

		  A[p][j]=q[j];

		}

		     }

}

for (int i=0; i<n; i++)

{

	for (int j=0;j<n;j++)

   {

      cout<<"A["<<i<<"]["<<j<<"]="<<A[i][j]<<"   ";

   }

}

cout<<"privedena"<<endl;

//------------------------------------------------------------

for (int i=0;i<n;i++)                           //1 shag

{

	x[i]=F[i]/A[i][i];

	cout<<"x["<<i<<"]="<<x[i]<<endl;

}     

for (int i=0;i<n;i++) {                      

				if (x[i]<E) {c=c+1;}   

			     }

if (c==n) {goto END;} 

else c=0; 

goto V;

V: for (int i=0;i<n;i++) {y[i]=x[i];}

   for (int i=0;i<n;i++) 



   {

	l=0; t=0;

    for (int j=0;j<i;j++)

	{ 

if(j<i) {l=l+A[i][j]*y[j];} 

      }

   for (int k=i+1;k<n;k++)

	{

		if(k<n) {t=t+A[i][k]*y[k];}

	}

   x[i]=(F[i]-l-t)/A[i][i];

   cout<<"x["<<i<<"]="<<x[i];

  }

cout<<endl;

for (int i=0;i<n;i++)	

{

        r=x[i]-y[i]; 

        if(r<0){r=-r;} 

        if (r<E){c=c+1;}

}

if (c==n) {goto END;} 

else {c=0; 

        goto V;}

END: cout<<"Zadacha reshena!"<<endl; 

return 0;

}





4. Реализация на языке С++ задачи №2.

#include <iostream>

using namespace std;

int main()

{

int c=0,n,p,z;

float l=0,t=0,E,max,r;

cout<<"kol-vo perem=";

cin>>n;

cout<<n<<endl;

float A[n][n],F[n], x[n],y[n],q[n];

for (int i=0; i<n; i++)

{

   for (int j=0;j<n;j++)

   {

      cout<<"A["<<i<<"]["<<j<<"]=";

      cin>>A[i][j];

   }

}

for (int i=0;i<n;i++) 

{

	cout<<"F["<<i<<"]=";

	cin>>F[i];

}

cout<<"priblijenie=";

cin>>E;

cout<<E<<endl;

cout<<"OK!"<<endl;

//--------------------------------------------------------------

for (int i=0;i<n;i++)

{

	max=A[i][0]; 

	for (int j=0;j<n;j++)

	{

		if (max<A[i][j]) {max=A[i][j];p=i,z=j;}

	}

	if (p!=z) {for (int j=0;j<n;j++) 										{

				q[j]=A[z][j];

				A[z][j]=A[p][j];

				A[p][j]=q[j];

			}

		    }	

}

for (int i=0; i<n; i++)

{

	for (int j=0;j<n;j++)

      {

      	cout<<"A["<<i<<"]["<<j<<"]="<<A[i][j]<<"   ";

      }

}

cout<<"privedena"<<endl;

//----------------------------------------------------------

V: for (int i=0;i<n;i++) 

	{

		y[i]=x[i];

	}

   for (int i=0;i<n;i++)	

	{

		l=0; 

		t=0;

		for (int j=0;j<i;j++)

		{

			if(j<i){l=l+A[i][j]*x[j];}	

		}

		for (int k=i+1;k<n;k++)

		{

			if(k<n) {t=t+A[i][k]*x[k];}

		}

		x[i]=(F[i]-l-t)/A[i][i];

cout<<"x["<<i<<"]="<<x[i];

	}

   cout<<endl;

   for (int i=0;i<n;i++)	

   {

	r=x[i]-y[i]; 

	if(r<0){r=-r;} 

	if (r<E){c=c+1;}

   }

   if (c==n) {goto END;} 

   else {	

		c=0; 

		goto V;

        }

END: cout<<"Zadacha reshena!"<<endl; 

return 0;

}







5. Реализация на языке Fortran задачи №1.

        n=0

        c=0

        read(*,*)n,e

        dimension A(n,n),F(n),X(n),y(n)

        t=0

        l=0

        do i=1:n:1

          do j=1:n:1

            read (*,*) A(i,j)

          enddo

        enddo

        do i=1:n:1

          read (*,*) F(i)

        enddo

        write ('priblizhenie=')

        read (*,*) e

	  do i=1:n:1

		X(i)=F(i)/A(i)(i)

	  enddo

	  do i=1:n:1

		if (X(i).lt.e) c=c+1

		endif

	      if (c.eq.n) goto END

		endif

		else c=0

     goto V

	  enddo		

   V:   do i=1:n:1

            y(i)=X(i)

        enddo

        do i=1:n:1

		l=0

		t=0

           do j=1:i:1

                if (j.lt.i) l=l+A(i)(j)*y(j)

		    endif

	     enddo

	     do k=i+1:n:1

		if (k.lt.n) t=t+A(i)(k)*y(k)

            endif

           enddo

	    X(i)=(F(i)-l-t)/A(i)(i)

	   enddo

         do i=i:n:1

           r=X(i)-y(i)

	       if (r.lt.0) r=-r

		 endif

		if (r.lt.e) c=c+1

		endif

         enddo

         if (c.eq.n) goto END

	   endif 

		else c=0

		goto V             

     END: do i=0:n:1

            write (*,*) X(i)

          enddo 

        

         end









6. Реализация на языке Fortran задачи №2.

        n=0

        c=0

        read(*,*)n,e

        dimension A(n,n),F(n),X(n),y(n)

        t=0

        l=0

        do i=1:n:1

          do j=1:n:1

            read (*,*) A(i,j)

          enddo

        enddo

        do i=1:n:1

          read (*,*) F(i)

        enddo

        write ('priblizhene=')

        read (*,*) e

   V:   do i=1:n:1

          y(i)=X(i)

        enddo

        do i=1:n:1

		l=0

		t=0

          do j=1:i:1

                if (j.lt.i) l=l+A(i)(j)*X(j)

		    endif

	    enddo

	    do k=i+1:n:1

		if (k.lt.n) t=t+A(i)(k)*X(k)

            endif

          enddo

	   x[i]=(F[i]-l-t)/A[i][i]

	   enddo

         do i=i:n:1

           r=X(i)-y(i)

	       if (r.lt.0) r=-r

		 endif

		if (r.lt.e) c=c+1

		endif

         enddo

         if (c.eq.n) goto END 

		else c=0

		goto V

	   endif

             

         END: do i=0:n:1

              write (*,*) y(i)

              enddo 

        

         end







        

    7.Реализация в Matlab задачи №1.

clear

n=input('Vvedite kolichestvo peremennih: ');

for i=1:n

   for j=1:n

	A(i,j)=input('Vvedite element matrici A: ');

   end

end

for  i=1:n

   F(i)=input('Vvedite element matrici F: ');

end

E=input('Vvedite priblijenie: ');

p=0;

z=0;

max=0;

c=0;

d=0;

if (det(A)~=0)

 for i=1:n

   max=A(i,1)

	for j=1:n

	   if  max<A(i,j) 

	        max=A(i,j);

	        p=i;

		z=j;

	   end

	end

	if p~=z 

	   for j=1:n

		q(j)=A(z,i);

		A(z,j)=A(p,j);

		A(p,j)=q(j);

	   end

	end

 end

end

for i=1:n

   x(i)=F(i)/A(i,i);

end

for i=1:n

   if x(i)<E

	c=c+1;

   end

end

if c==n

   d=1;

end

while d==0

 for i=1:n

    y(i)=x(i);

 end

 for i=1:n

    l=0;

    t=0;

	for j=0:i 

	   if j<i

		l=l+A(i,j)*y(j);

	   end

	end

	for k=i+1:n

	   if k<n

		t=t+A(i,k)*y(k);

	   end

	end

   x(i)=(F(i)-l-t)/A(i,i);

 end

 for i=1:n 

   r=x(i)-y(i)

	if r<0

	   r=-r;

	end

	if r<E 

	   c=c+1

	end

 end

 if c==n

	d=1;

 end 

end









8. Реализация в Matlab задачи №2. 

clear

n=input('Vvedite kolichestvo peremennih: ');

for i=1:n

   for j=1:n

	A(i,j)=input('Vvedite element matrici A: ');

   end

end

for  i=1:n

   F(i)=input('Vvedite element matrici F: ');

end

E=input('Vvedite priblijenie: ');

p=0;

z=0;

max=0;

c=0;

d=0;

if (det(A)~=0)

 for i=1:n

   max=A(i,1)

	for j=1:n

	   if  max<A(i,j) 

	        max=A(i,j);

	        p=i;

		z=j;

	   end

	end

	if p~=z 

	   for j=1:n

		q(j)=A(z,i);

		A(z,j)=A(p,j);

		A(p,j)=q(j);

	   end

	end

 end

end

while d==0

 for i=1:n

   y(i)=x(i);

 end

 for i=1:n

   l=0;

   t=0;

	for j=0:i 

	   if j<i

		l=l+A(i,j)*y(j);

	   end

	end

	for k=i+1:n

	   if k<n

		t=t+A(i,k)*y(k);

	   end

	end

   x(i)=(F(i)-l-t)/A(i,i);

 end

 for i=1:n 

   r=x(i)-y(i)

	if r<0

	   r=-r;

	end

	if r<E 

	   c=c+1

	end

 end

 if c==n

	d=1;

 end

end







Рeзультаты задачи №1 на С++ и Fortran:

x[0]=1.004

x[1]=0.998

x[2]=0.998

Рeзультаты задачи №1 в Matlab:



Рeзультаты задачи №2 на С++ и Fortran:

x[0]=1.00067

x[1]=0.999734

x[2]=0.999906

Рeзультаты задачи №1 в Matlab: 



Результаты программ на С++ и Fortran совпадают с результатами ручного счёта.  А в Matlab получились более точные числа, это связано с использованием другой системы счисления. 









9.Вывод.

Научились решать системы линейных алгебраических уравнений методом простой итерации и методом Зейделя.











10.Список литературы.

Л.Н. Турчак , П.В. Плотников «Основы численных методов» стр.124-131



14

14