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