Решение систем линейных алгебраических уравнений 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 (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 (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 kt=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
Нравится материал? Поддержи автора!
Ещё документы из категории математика:
Чтобы скачать документ, порекомендуйте, пожалуйста, его своим друзьям в любой соц. сети.
После чего кнопка «СКАЧАТЬ» станет доступной!
Кнопочки находятся чуть ниже. Спасибо!
Кнопки:
Скачать документ