Решение систем линейных алгебраических уравнений 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

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<

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

for (int i=0; i

{

for (int j=0;j

{

cout<<"A["<

cin>>A[i][j];

}

}

for (int i=0;i

{

cout<<"F["<

cin>>F[i];

}

cout<<"priblijenie=";

cin>>E;

cout<

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

for (int i=0;i

{ max=A[i][0];

for (int j=0;j

{

if (max

}

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

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

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

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

}

}

}

for (int i=0; i

{

for (int j=0;j

{

cout<<"A["<

}

}

cout<<"privedena"<

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

for (int i=0;i

{

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

cout<<"x["<

}

for (int i=0;i

if (x[i]

}

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

else c=0;

goto V;

V: for (int i=0;i

for (int i=0;i


{

l=0; t=0;

for (int j=0;j

{

if(j

}

for (int k=i+1;k

{

if(k

}

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

cout<<"x["<

}

cout<

for (int i=0;i

{

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

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

if (r

}

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

else {c=0;

goto V;}

END: cout<<"Zadacha reshena!"<

return 0;

}



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

#include

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<

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

for (int i=0; i

{

for (int j=0;j

{

cout<<"A["<

cin>>A[i][j];

}

}

for (int i=0;i

{

cout<<"F["<

cin>>F[i];

}

cout<<"priblijenie=";

cin>>E;

cout<

cout<<"OK!"<

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

for (int i=0;i

{

max=A[i][0];

for (int j=0;j

{

if (max

}

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

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

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

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

}

}

}

for (int i=0; i

{

for (int j=0;j

{

cout<<"A["<

}

}

cout<<"privedena"<

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

V: for (int i=0;i

{

y[i]=x[i];

}

for (int i=0;i

{

l=0;

t=0;

for (int j=0;j

{

if(j

}

for (int k=i+1;k

{

if(k

}

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

cout<<"x["<

}

cout<

for (int i=0;i

{

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

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

if (r

}

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

else {

c=0;

goto V;

}

END: cout<<"Zadacha reshena!"<

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  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) 	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  l=l+A(i,j)*y(j);  end 	end 	for k=i+1:n  if k  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  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  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  l=l+A(i,j)*y(j);  end 	end 	for k=i+1:n  if k  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  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

Нравится материал? Поддержи автора!

Ещё документы из категории математика:

X Код для использования на сайте:
Ширина блока px

Скопируйте этот код и вставьте себе на сайт

X

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

После чего кнопка «СКАЧАТЬ» станет доступной!

Кнопочки находятся чуть ниже. Спасибо!

Кнопки:

Скачать документ