КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Исходный код
Теория. Курсовая работа С.И.Самыгин ИСТОРИЯ Ответственный за выпуск: Редактор: Корректор: Художник: Верстка: Кузнецов В. Федоров И. Тарасенко Н. Лойкова И. Патулова А. Сдано в набор 3.10.2006 г. Подписано в печать 25.10.2006 г. Формат 84x108 1/32. Бумага типографская. Гарнитура Школьная. Тираж 5 000. Заказ № 606 Издательство «Феникс» 344082, г. Ростов-на-Дону, пер. Халтуринский, 80 Отпечатано с готовых диапозитивов в ЗАО «Книга». 344019, г. Ростов-на-Дону, ул. Советская, 57. Качество печати соответствует предоставленным диапозитивам. «Сравнение точных методов» по дисциплине
студентки группы УВА-211 Булгаковой Ирины Владимировны
Проверил: проф. каф. ПМ-1 __________ Волосов Константин Александрович
Москва 2013
1) Метод Гаусса. #include "stdafx.h" #include "conio.h" #include "iostream" #include "stdio.h" #include "clocale" #include "math.h" #include "complex" using namespace std; const int fact=10; complex <float> normA(0,0); complex <float> normA1(0,0); complex <float> x[fact]; short n; int N=0; complex <float> Det2(complex <float> r[fact][fact]) { complex <float> det2=r[0][0]*r[1][1]-r[0][1]*r[1][0]; N++; return det2; } complex <float> Det(complex <float> h[fact][fact],short m) { complex <float> det(0,0); complex <float> s[fact][fact]; complex <float> M(0,0); for (int i=0;i<m;i++) { int l,g; l=0; g=0; for (int d=0;d<m;d++) for(int k=0;k<m;k++) if ((d==i)||(k==0)) {} else { s[l][g]=h[d][k]; //Формируем минор по данному элементу if (g<m-2) g++; else { g=0; l++; } } if ((m-1)==2) M=Det2(s); else M=Det(s,m-1); short st=pow(-1.00,(double)i+2); complex <float> q(st,0); det=det+q*h[i][0]*M; } return det; } complex <float> Obratnaya(complex <float> ob[fact][fact], short m, complex <float> D) { complex <float> s[fact][fact]; complex <float> c[fact][fact]; complex <float> Dg; int l,g; if (m==2) { c[0][0]=ob[1][1]; c[0][1]=-ob[0][1]; c[1][0]=-ob[1][0]; c[1][1]=ob[0][0]; } else for (int i=0;i<m;i++) for (int j=0;j<m;j++) { l=0; g=0; for (int d=0;d<m;d++) for(int k=0;k<m;k++) if ((d==i)||(k==j)) {} else { s[l][g]=ob[d][k]; //Формируем минор по данному элементу if (g<m-2) g++; else { g=0; l++; } } if ((m-1)==2) Dg=Det2(s); else Dg=Det(s,m-1); short st=pow(-1.00,(double)i+j+2); complex <float> q(st,0); c[j][i]=q*Dg; //Записываем посчитанный элемент в транспонированную матрицу } for (int i=0;i<m;i++) for (int j=0;j<m;j++) c[i][j]=c[i][j]/D; //Делим каждый элемент транспонированной матрицы на определитель for (int i=0;i<m;i++) for (int j=0;j<m;j++) normA1=normA1+pow(c[i][j],2); normA1=sqrt(normA1); //Вычисляем норму обратной матрицы return c[fact][fact]; } complex <float> Gauss(complex <float> t[fact][fact]) { for (int k=0;k<n;k++) { if (t[k][k].real()!=1) for (int i=n;i>=k;i--) { t[k][i]=t[k][i]/t[k][k]; // По диагонали делаем единицы N++; } for (int i=k+1;i<n;i++) if (t[i][k].real()!=0) for (int j=n;j>=k;j--) { t[i][j]=t[i][k]*t[k][j]-t[i][j]; // Делаем нули под каждой единицей на диагонали N++; } } //Обратный ход Гаусса for (int i=0;i<n;i++) { complex <float> q(t[i][n].real(),t[i][n].imag()); x[i]=q; //Задаем начальные значения для решений системы N++; } for (int i=n-2;i>=0;i--) for (int j=i+1;j<n;j++) { x[i]=x[i]-t[i][j]*x[j]; //Вычисляем решения N++; } return x[fact]; } void main() { setlocale(LC_CTYPE,""); puts("Введите размерность матрицы <10 "); cin>>n; complex <float> a[fact][fact]; for (int i=0;i<n;i++) { float re,im; cout<<"Помните, что в строке "<<n+1<<" элемента(ов),\n включая свободные члены"; cout<<"\nВведите "<<i+1<<"-ю строку матрицы\n"; for (int j=0;j<=n;j++) { printf("a[%d][%d]:",i,j); printf(" Real="); scanf("%f",&re); printf("Imagine="); scanf("%f",&im); complex <float> q(re,im); a[i][j]=q; } } cout<<"Вывод матрицы\n"; for (int i=0;i<n;i++) { for (int j=0;j<=n;j++) printf(" [%d][%d]:%5.2f%5.2f",i,j,a[i][j].real(),a[i][j].imag()); cout<<"\n"; } //Вычисляем норму матрицы for (int i=0;i<n;i++) for (int j=0;j<n;j++) normA=normA+pow(a[i][j],2.0); normA=sqrt(normA);
complex <float> z[fact][fact]; for (int i=0;i<n;i++) for (int j=0;j<=n;j++) { z[i][j]=a[i][j]; } // Считаем определитель complex <float> D; if (n==2) D=Det2(a); else D=Det(a,n); if (D.real()==0 && D.imag()==0) printf("Система вырождена и не имеет решений, определитель равен %d",D); else { printf("D: Re=%5.2f Im=%5.2f\n",D.real(),D.imag()); Obratnaya(a,n,D); Gauss(z); cout<<"Вывод решений\n"; for (int i=0;i<n;i++) printf(" x[%d]:Re=%8.3fIm=%8.3f\n",i,x[i].real(),x[i].imag()); cout<<"\n"; //Находим норму Х complex <float> normX(0,0); for (int i=0;i<n;i++) normX=normX+pow(x[i],2); normX=sqrt(normX); complex <float> xst[fact]; for (int i=0;i<n;i++) xst[i]=x[i]; //Находим норму В complex <float> normB(0,0); for (int i=0;i<n;i++) normB=normB+pow(a[i][n],2); normB=sqrt(normB); printf("Количество операций %d\n",N); printf("Введите погрешность "); float re; scanf("%f",&re); complex <float> delta(re,0); printf("delta=%6.3f %6.3f\n",delta.real(),delta.imag()); //Находим норму дельтa b complex <float> delb(0,0); for(int i=0;i<n;i++) delb=delb+pow(delta,2); delb=sqrt(delb); for (int i=0;i<n;i++) a[i][n]=a[i][n]+delta; Gauss(a); cout<<"Вывод решений с погрешностью\n"; for (int i=0;i<n;i++) printf(" x[%d]:Re=%8.3fIm=%8.3f\n",i,x[i].real(),x[i].imag()); cout<<"\n"; printf("Норма матрицы=%5.2f %5.2f\n",normA.real(),normA.imag()); printf("Норма обратной матрицы=%5.2f %5.2f\n",normA1.real(), normA1.imag()); complex <float> condA; condA=normA*normA1; //Число обусловленности printf("Число обусловлености=%5.2f %5.2f\n",condA.real(),condA.imag()); //Находим норму дельта х complex <float> Delx[fact]; complex <float> normDelx(0,0); for (int i=0;i<n;i++) { Delx[i]=x[i]-xst[i]; normDelx=normDelx+pow(Delx[i],2); } normDelx=sqrt(normDelx); printf("Норма дельта x=%8.6f %8.6f\n",normDelx.real(),normDelx.imag()); printf("Норма дельта b=%8.6f %8.6\n",delb.real(),delb.imag()); printf("Норма b=%8.6f %8.6f\n",normB.real(),normB.imag()); printf("Нормa X=%8.6f %8.6f\n",normX.real(),normX.imag()); complex <float> left(0,0); left=normDelx/normX; complex <float> right(0,0); right=condA*delb/normB; printf("Апостериорная ошибка= %8.6f %8.6f\n",left.real(),left.imag()); printf("Априорная ошибка= %8.6f %8.6f\n",right.real(),right.imag()); } getch(); } 2) Метод Крамера. #include "stdafx.h" #include "conio.h" #include "iostream" #include "stdio.h" #include "clocale" #include "math.h" #include "complex" using namespace std; const int fact=10; complex <float> normA(0,0); complex <float> normA1(0,0); complex <float> b[fact]; complex <float> answ[fact]; short int n; int N=0; complex <float> Det2(complex <float> r[fact][fact]) { complex <float> det2=r[0][0]*r[1][1]-r[0][1]*r[1][0]; N++; return det2; } complex <float> Det(complex <float> a[fact][fact],short m) { complex <float> det(0,0); complex <float> s[fact][fact]; complex <float> M; int l,g; for (int i=0;i<m;i++) { l=0; g=0; for (int d=0;d<m;d++) for(int k=0;k<m;k++) if ((d==i)||(k==0)) {} else { s[l][g]=a[d][k]; //Формируем минор по данному элементу N++; if (g<m-2) g++; else { g=0; l++; } N++; } if ((m-1)==2) M=Det2(s); else M=Det(s,m-1); short st=pow(-1.00,(double)i+2); complex <float> q(st,0); det=det+q*a[i][0]*M; } return det; } complex <float> Obratnaya(complex <float> ob[fact][fact], short m, complex <float> D) { complex <float> s[fact][fact]; complex <float> c[fact][fact]; complex <float> Dg; int l,g; if (m==2) { c[0][0]=ob[1][1]; c[0][1]=-ob[0][1]; c[1][0]=-ob[1][0]; c[1][1]=ob[0][0]; } else for (int i=0;i<m;i++) for (int j=0;j<m;j++) { l=0; g=0; for (int d=0;d<m;d++) for(int k=0;k<m;k++) if ((d==i)||(k==j)) {} else { s[l][g]=ob[d][k]; //Формируем минор по данному элементу if (g<m-2) g++; else { g=0; l++; } } if ((m-1)==2) Dg=Det2(s); else Dg=Det(s,m-1); short st=pow(-1.00,(double)i+j+2); complex <float> q(st,0); c[j][i]=q*Dg; //Записываем посчитанный элемент в транспонированную матрицу } for (int i=0;i<m;i++) for (int j=0;j<m;j++) c[i][j]=c[i][j]/D; //Делим каждый элемент транспонированной матрицы на определитель for (int i=0;i<m;i++) for (int j=0;j<m;j++) normA1=normA1+pow(c[i][j],2); normA1=sqrt(normA1); //Вычисляем норму обратной матрицы return c[fact][fact]; } complex <float> Kramer(complex <float> a[fact][fact],complex <float> b[fact],complex <float> D) { complex <float> detxy[fact][fact]; for (int i=0;i<n;i++) for (int j=0;j<n;j++) detxy[i][j]=a[i][j]; //Формируем матрицу для подсчета определителя каждой переменной N++; for (int j=0;j<n;j++) { for (int i=0;i<n;i++) { detxy[i][j]=b[i]; //Замещаем один столбец матрицы на свободные члены N++; } if (n==2) answ[j]=Det2(detxy)/D; else answ[j]=Det(detxy,n)/D; // Находим значения переменных N++; N++; for (int i=0;i<n;i++) for(int q=0;q<n;q++) detxy[i][j]=a[i][j]; //Возвращаем матрице значение исходной матрицы } return answ[fact]; } void main() { setlocale(LC_CTYPE,""); complex <float> a[fact][fact]; puts("Введите размерность матрицы <=10 "); cin>>n; float re,im; for (int i=0;i<n;i++) { cout<<"Помните, что в строке "<<n<<" элемента(ов)\n"; cout<<"Введите "<<i+1<<"-ю строку матрицы\n"; for (int j=0;j<n;j++) { printf("a[%d][%d]:",i,j); printf(" Real="); scanf("%f",&re); printf("Imagine="); scanf("%f",&im); complex <float> q(re,im); a[i][j]=q; } } cout<<"Введите свободные члены\n"; for (int i=0;i<n;i++) { printf("b[%d]:",i); printf(" Real="); scanf("%f",&re); printf("Imagine="); scanf("%f",&im); complex <float> q(re,im); b[i]=q; } cout<<"Вывод матрицы\n"; for (int i=0;i<n;i++) { for (int j=0;j<n;j++) printf(" a[%d][%d]:%8.6f %8.6f",i,j,a[i][j].real(),a[i][j].imag()); cout<<"\n"; } cout<<"Вывод свободных членов\n"; for (int i=0;i<n;i++) printf("b[%d]:%8.6f %8.6f ",i,b[i].real(),b[i].imag()); cout<<"\n"; //Вычисляем норму матрицы for (int i=0;i<n;i++) for (int j=0;j<n;j++) normA=normA+pow(a[i][j],2.0); normA=sqrt(normA); // Считаем определитель complex <float> D; if (n==2) D=Det2(a); else D=Det(a,n); if (D.real()==0 && D.imag()==0) printf("Система не имеет решений, определитель равен %d",D); else { printf("D:%8.6f %8.6f\n",D.real(),D.imag()); Obratnaya(a,n,D); Kramer(a,b,D); printf("Вывод решений\n"); for (int i=0;i<n;i++) printf("answ[%d]:%8.6f %8.6f ",i,answ[i].real(),answ[i].imag()); cout<<"\n"; //Находим норму Х complex <float> normX(0,0); for (int i=0;i<n;i++) normX=normX+pow(answ[i],2); normX=sqrt(normX); complex <float> answst[fact]; for (int i=0;i<n;i++) answst[i]=answ[i]; //Находим норму В complex <float> normB(0,0); for (int i=0;i<n;i++) normB=normB+pow(b[i],2); normB=sqrt(normB); printf("Количество операций %d\n",N); printf("Введите погрешность "); float re; scanf("%f",&re); complex <float> delta(re,0); printf("delta=%6.3f %6.3f\n",delta.real(),delta.imag()); //Находим норму дельтa b complex <float> delb(0,0); for(int i=0;i<n;i++) delb=delb+pow(delta,2); delb=sqrt(delb); for (int i=0;i<n;i++) b[i]=b[i]+delta; Kramer(a,b,D); cout<<"Вывод решений с погрешностью\n"; for (int i=0;i<n;i++) printf(" answ[%d]:Re=%8.6fIm=%8.6f\n",i,answ[i].real(),answ[i].imag()); cout<<"\n"; printf("Норма матрицы=%8.6f %8.6f\n",normA.real(),normA.imag()); printf("Норма обратной матрицы=%8.6f %8.6f\n",normA1.real(), normA1.imag()); complex <float> condA; condA=normA*normA1; //Число обусловленности printf("Число обусловлености=%8.6f %8.6f\n",condA.real(),condA.imag()); //Находим норму дельта х complex <float> Delx[fact]; complex <float> normDelx(0,0); for (int i=0;i<n;i++) { Delx[i]=answ[i]-answst[i]; normDelx=normDelx+pow(Delx[i],2); } normDelx=sqrt(normDelx); printf("Норма дельта x=%8.6f %8.6f\n",normDelx.real(),normDelx.imag()); printf("Норма дельта b=%8.6f %8.6\n",delb.real(),delb.imag()); printf("Норма b=%8.6f %8.6f\n",normB.real(),normB.imag()); printf("Нормa X=%8.6f %8.6f\n",normX.real(),normX.imag()); complex <float> left(0,0); left=normDelx/normX; complex <float> right(0,0); right=condA*delb/normB; printf("Апостериорная ошибка= %8.6f %8.6f\n",left.real(),left.imag()); printf("Априорная ошибка= %8.6f %8.6f\n",right.real(),right.imag()); } getch(); }
Дата добавления: 2014-11-29; Просмотров: 734; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |