отчёт 4. Лабораторная работа 4 исследование решения систем линейных алгебраических уравнений (слау) методом гаусса
Скачать 331.88 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» Лабораторная работа №4 ИССЛЕДОВАНИЕ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ (СЛАУ) МЕТОДОМ ГАУССА Вариант №5 Студент: гр. УТ – 21 Петухов П.А. Преподаватель: Чуркин В.В. Киров 2013 год 1.Задание.
2.Формулы. Методом Гаусса называют точный метод решения невырожденной системы линейных уравнений состоящий в том что последовательным исключением неизвестных систему приводят к эквивалентной системе с верхней треугольной матрицей решение которой находят по рекуррентным формулам Метод Гаусса содержит прямой ход на котором исходную систему преобразуют к треугольному виду и обратный ход на котором решают треугольную систему эквивалентную исходной 3.Решение СЛАУ в Mathcad’е. 4.Блок-схемы алгоритмов. 1)Прямой ход алгоритма метода Гаусса 2)Обратный ход 5.Таблица идентификаторов
6.Код программы Содержание модуля Class1.cpp //--------------------------------------------------------------------------- #pragma hdrstop #include "Class1.h" #include "string.h" #include "strstream.h" #include "Unit1.h" #include "Unit2.h" #include "Unit3.h" #include "Unit4.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CSPIN" //#pragma resource "*.dfm" void Class1::aboutme() { Application->MessageBox("Данное приложение выполнено студентом ВятГУ Факультета АВТ группы УТ-21 Петуховым Павлом", "О создателе" ); } const int n=3; const float a[][4]={{1.53,1.61,1.43,-5.13},{2.35,2.31,2.07,-3.69}, {3.83,3.73,3.45,-5.98}}; float x[3]; void Class1::test_SLAU_3() { AnsiString s; for(int j=0;j<3;j++){ if(j<2)s=" + "; else s=""; for(int i=0;i<3;i++){ Form1->StringGrid1->Cells[2*j][i]=FloatToStrF(a[i][j],ffFixed,5,2) +" * "; Form1->StringGrid1->Cells[2*j+1][i]=" x["+IntToStr(j)+"]"+s;} for(int i=0;i<3;i++){ Form1->StringGrid1->Cells[6][i]=" = "; Form1->StringGrid1->Cells[7][i]=FloatToStrF(a[i][3],ffFixed,5,2);}} } void Class1::gauss(float& nev,int& mul,int& ad) { int i,j,k,l; float a1[3][4],c,b,s; //копирование исходной матрицы во вспомогательную матрицу for(i=0;i for(j=0;j //решение СЛАУ mul=ad=0; for(i=0;i c=a1[i][i]; for(j=i;j for(k=i+1;k b=a1[k][i]; for(l=i;l {a1[k][l]-=b*a1[i][l]; ad++; mul++;}}} x[n-1]=a1[n-1][n]/a1[n-1][n-1]; mul++; for(k=n-2;k>=0;k--){ s=0; for(j=k+1;j {s+=a1[k][j]*x[j]; ad++; mul++;} x[k]=a1[k][n]-s; ad++;} //вычисление невязки c=0; for(int i=0;i b=0; for(int j=0;j c+=pow(b-a[i][n],2);} nev=sqrt(c)/n; } void Class1::helpf() { Form3->Show(); //обращение к форме } void Class1::resh() { int mul,ad; float nev; gauss(nev,mul,ad); for(int i=0;i<3;i++){ Form1->StringGrid2->Cells[0][i]=" x["+IntToStr(i)+"] = "; Form1->StringGrid2->Cells[1][i]=FloatToStrF(x[i],ffFixed,7,5);} Form1->LabeledEdit1->Text=FloatToStrF(nev,ffExponent,4,2); Form1->LabeledEdit2->Text=IntToStr(mul); Form1->LabeledEdit3->Text=IntToStr(ad);} void Class1::test_SLAU_n() { Form2->Show(); Form2->StringGrid1->Cells[0][0]=" n"; Form2->StringGrid1->Cells[1][0]=" k"; Form2->StringGrid1->Cells[2][0]=" mul"; Form2->StringGrid1->Cells[3][0]=" ad"; Form2->StringGrid1->Cells[4][0]=" nev_f"; Form2->StringGrid1->Cells[5][0]=" nev_d"; Form2->StringGrid1->Cells[6][0]=" nev_ld"; } template void Class1::gauss_1(float**b,int n,T& nev,int& mul,int& ad) { T c,z,d,s; int max; T* x=new T[n]; T** a=new T*[n]; for(int i=0;i for(int i=0;i for(int j=0;j a[i][j]=b[i][j]; mul=ad=0; for(int i=0;i max=i; for(int k=i+1;k if(fabs(a[k][i])>fabs(a[max][i])) max=k; for(int j=i;j {z=a[i][j]; a[i][j]=a[max][j]; a[max][j]=z;} c=a[i][i]; for(int j=i;j for(int k=i+1;k d=a[k][i]; for(int l=i;l {a[k][l]-=d*a[i][l]; mul++; ad++;}}} x[n-1]=a[n-1][n]/a[n-1][n-1]; mul++; for(int k=n-2;k>=0;k--){ s=0; for(int j=k+1;j x[k]=a[k][n]-s; ad++;} //вычисление невязки c=0; for(int i=0;i d=0; for(int j=0;j c+=pow(d-b[i][n],2);} nev=sqrt(c)/n; for(int i=0;i delete[]a; a=0; delete[]x; x=0; } //--------------------------------------------------------------------------- int pk=1; //--------------------------------------------------------------------------- void Class1::resh1() { Form4->Series1->Clear(); Form4->Series2->Clear(); Form4->Series3->Clear(); Form4->Series4->Clear(); Form4->Series5->Clear(); int count=0, current=0; for(int n=Form2->CSpinEdit1->Value; n<=Form2->CSpinEdit2->Value; n+=Form2->CSpinEdit3->Value) count+=n; count*=Form2->CSpinEdit4->Value; float**b,w,z; int mul,smul,ad,sad; float nev_f,snev_f; double nev_d,snev_d; long double nev_ld,snev_ld; int k=Form2->CSpinEdit4->Value; for(int n=Form2->CSpinEdit1->Value; n<=Form2->CSpinEdit2->Value;n+=Form2->CSpinEdit3->Value){ b=new float*[n]; for(int i=0;i b[i]=new float[n+1]; smul=0; sad=0; snev_f=0; snev_d=0; snev_ld=0; for(int kc=0;kc srand(time(NULL)); for(int i=0;i w=rand()%(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value+1)+Form2->CSpinEdit8->Value +(float)random(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value+1) /(Form2->CSpinEdit7->Value-Form2->CSpinEdit8->Value)-0.5; if(w>Form2->CSpinEdit7->Value)w=Form2->CSpinEdit7->Value; if(w b[i][n]=w; for(int j=0;j z=rand()%(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value+1)+Form2->CSpinEdit6->Value +(float)random(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value+1) /(Form2->CSpinEdit5->Value-Form2->CSpinEdit6->Value)-0.5; if(z>Form2->CSpinEdit5->Value)z=Form2->CSpinEdit5->Value; if(z b[i][j]=z; }} gauss_1(b,n,nev_f,mul,ad); snev_f+=nev_f; smul+=mul; sad+=ad; gauss_1(b,n,nev_d,mul,ad); snev_d+=nev_d; gauss_1(b,n,nev_ld,mul,ad); snev_ld+=nev_ld; current+=n; Form2->ProgressBar1->Position=100*current/count; } Form2->StringGrid1->Cells[0][pk]=IntToStr(n); Form2->StringGrid1->Cells[1][pk]=IntToStr(k); Form2->StringGrid1->Cells[2][pk]=IntToStr(smul); Form2->StringGrid1->Cells[3][pk]=IntToStr(sad); Form2->StringGrid1->Cells[4][pk]=FloatToStrF(snev_f/k,ffExponent,5,4); Form2->StringGrid1->Cells[5][pk]=FloatToStrF(snev_d/k,ffExponent,5,4); Form2->StringGrid1->Cells[6][pk]=FloatToStrF(snev_ld/k,ffExponent,5,4); Form4->Series1->AddXY(n,smul,"",clRed); Form4->Series2->AddXY(n,sad,"",clGreen); Form4->Series3->AddXY(n,snev_f/k*1.0e6,"",clRed); Form4->Series4->AddXY(n,snev_d/k*1.0e15,"",clGreen); Form4->Series5->AddXY(n,snev_ld/k*1.0e18,"",clBlack); pk++; for(int i=0;i delete[]b; b=0; } } void Class1::graf() { Form4->Show(); } void Class1::sbros() { for(int i=1;i for(int j=0;j Form2->StringGrid1->Cells[j][i]=""; Form2->ProgressBar1->Position=0; Form4->Series1->Clear(); Form4->Series2->Clear(); Form4->Series3->Clear(); Form4->Series4->Clear(); Form4->Series5->Clear(); pk=1; } 7.Результаты выполнения работы в виде таблиц и графиков 8.Библиографический список. В.В.ЧУРКИН ЧИСЛЕННЫЕ МЕТОДЫ (с алгоритмами и программами в среде C++Builder) Учебно-методическое пособие. 2013. |