Реферат: Решение систем линейных алгебраических уравнений 2 - Refy.ru - Сайт рефератов, докладов, сочинений, дипломных и курсовых работ

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

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