|
|||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Применение метода к конкретной задаче (анализ)Составляя задачи на языке программирования Borland C++ Builder 6 для реализации точных методов решения СЛАУ я учитывал разное количество уравнений в системе (размерность матрицы задавал равным nxn). Но для проверки результатов использовал систему уравнений:
Вообще говоря, процесс Зейделя сходится быстрее, чем метод Якоби. Бывает, что процесс Зейделя сходится, когда простая итерация расходится и т.п. Правда, бывает и наоборот. Во всяком случае, достаточные условия сходимости для метода Якоби достаточны и для сходимости метода Зейделя. Реализовав программы из полученного ответа я увидел, что процесс Зейделя сходится быстрее. Это видно по количеству итераций полученных в программе при приближенной точности =0,000001. Если для метода Якоби они составляют 16, то для метода Зейделя они составляют 9. Также рассматривая метод верхней релаксации и сравнивая его с двумя другими методами видно, что в методе верхней релаксации количество итераций зависит от заданного числового параметра w. Задавая w=1, количество итераций равно 9, уменьшая значение параметра от 1 количество итераций начинает расти, в свою очередь увеличивая параметр количество итераций тоже начинает расти. Приведем таблицу показывающих количество итераций (k) при разных значениях параметра w:
Из всего этого можно сделать вывод, что итерационные методы сходятся быстрее, чем точные методы, о чем свидетельствуют как быстрое уменьшение невязок, так и уменьшение изменений неизвестных. Листинг программы // – #include <vcl.h> #pragma hdrstop #include «Unit1.h» // – #pragma package (smart_init) #pragma resource «*.dfm» #include<math.h> #include<stdlib.h> TForm1 *Form1; int n=0, prov=0, k=0; const x=100; float A[x] [x], B[x] [x]; float C[x], Y[x]; float *X; bool fl1=false; float e; float v_sh; // – __fastcall TForm1:TForm1 (TComponent* Owner) : TForm(Owner) { } // – void __fastcall TForm1: ButtonOkClick (TObject *Sender) { Memo1->Lines->Clear(); k=0; TryStrToInt (Edit1->Text, n); if (n>1) { StringGrid1->Enabled=true; StringGrid1->RowCount=n; StringGrid1->ColCount=n+1; ButtonClear->Enabled=true; ButtonOk->Enabled=false; StringGrid1->Color=clWindow; ButtonYakobi->Enabled=true; ButtonZeydel->Enabled=true; ButtonRelax->Enabled=true; X=new float[n]; for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { A[i] [j]=NULL; } X[i]=NULL; } } Else { ShowMessage («Число должно быть вещественного типа!»); } } // – void __fastcall TForm1: ButtonClearClick (TObject *Sender) { StringGrid1->Enabled=false; StringGrid1->RowCount=0; StringGrid1->ColCount=0; ButtonClear->Enabled=false; ButtonOk->Enabled=true; StringGrid1->Color=clBtnFace; ButtonYakobi->Enabled=false; } // – void __fastcall TForm1: ButtonYakobiClick (TObject *Sender) { //TryStrToFloat (Edit2->Text, e); Memo1->Lines->Clear(); e=StrToFloat (Edit2->Text); for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { TryStrToFloat (StringGrid1->Cells[j] [i], A[i] [j]); } } for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { if (A[i] [j]==NULL) { ShowMessage («Ошибка! Есть пустые ячейки!»); fl1=true; i=n; break; } } } if(! fl1) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (i!=j) B[i] [j]=(-1)*A[i] [j]/A[i] [i]; Else { B[i] [j]=0; C[i]=A[i] [n]/A[i] [i]; } } } for (int i=0; i<n; i++) X[i]=C[i]; float s=0; k=0; do { prov=0; for (int i=0; i<n; i++) { Y[i]=X[i]; for (int j=0; j<n; j++) { s+=B[i] [j]*X[i]; } X[i]=s+C[i]; s=0; } for (int i=0; i<n; i++) { if (fabs(X[i] – Y[i])<e) prov++; } k++; } while (prov!=n); Memo1->Lines->Add (» МЕТОД ЯКОБИ»); Memo1->Lines->Add(«»); String p=»»; Memo1->Lines->Add («Промежуточная матрица:»); for (int i=0; i<n; i++) { p=»»; for (int j=0; j<n+1; j++) { p+=FloatToStr (B[i] [j])+»»; } Memo1->Lines->Add(p); } Memo1->Lines->Add(«»); Memo1->Lines->Add («Корни СЛАУ равны:»); for (int i=0; i<n; i++) { if (X[i]!=NULL) { Memo1->Lines->Add («x»+IntToStr (i+1)+» = «+FloatToStr (X[i])); } Else { Memo1->Lines->Add («Нет корней!»); break; } } Memo1->Lines->Add(«»); Memo1->Lines->Add («Количество итераций = «+FloatToStr(k)); } } // – void __fastcall TForm1: ButtonExitClick (TObject *Sender) { Close(); } // – void __fastcall TForm1: RadioButton2Click (TObject *Sender) { ButtonYakobi->Visible=false; ButtonZeydel->Visible=true; ButtonRelax->Visible=false; } // – void __fastcall TForm1: RadioButton1Click (TObject *Sender) { ButtonYakobi->Visible=true; ButtonZeydel->Visible=false; ButtonRelax->Visible=false; } // – void __fastcall TForm1: ButtonZeydelClick (TObject *Sender) { Memo1->Lines->Clear(); k=0; e=StrToFloat (Edit2->Text); for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { TryStrToFloat (StringGrid1->Cells[j] [i], A[i] [j]); } } for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { if (A[i] [j]==NULL) { ShowMessage («Ошибка! Есть пустые ячейки!»); fl1=true; i=n; break; } } } if(! fl1) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (i!=j) B[i] [j]=(-1)*A[i] [j]/A[i] [i]; Else { B[i] [j]=0; C[i]=A[i] [n]/A[i] [i]; } } } for (int i=0; i<n; i++) { X[i]=rand(); } k=0; float s=0; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { s+=B[i] [j]; } Y[i]=s; s=0; } s=Y[0]; for (int i=1; i<n; i++) { if (s<Y[i]) s=Y[i]; Y[i]=0; } if (s<1) { do { s=0; for (int i=0; i<n; i++) { Y[i]=X[i]; } for (int i=0; i<n; i++) { s=C[i]; for (int j=0; j<n; j++) { s+=X[j]*B[i] [j]; } X[i]=s; } prov=0; for (int i=0; i<n; i++) { if (fabs(X[i] – Y[i])<e) prov++; } k++; } while (prov!=n); Memo1->Lines->Add (» МЕТОД ЗЕЙДЕЛЯ»); Memo1->Lines->Add(«»); String p=»»; Memo1->Lines->Add («Промежуточная матрица:»); for (int i=0; i<n; i++) { p=»»; for (int j=0; j<n+1; j++) { p+=FloatToStr (B[i] [j])+»»; } Memo1->Lines->Add(p); } Memo1->Lines->Add(«»); Memo1->Lines->Add («Корни СЛАУ равны:»); for (int i=0; i<n; i++) { if (X[i]!=NULL) { Memo1->Lines->Add («x»+IntToStr (i+1)+» = «+FloatToStr (X[i])); } Else { Memo1->Lines->Add («Нет корней!»); break; } } Memo1->Lines->Add(«»); Memo1->Lines->Add («Количество итераций = «+FloatToStr(k)); } else {Memo1->Lines->Add («СЛАУ является не сходимой!»);} } } // – void __fastcall TForm1: RadioButton3Click (TObject *Sender) { ButtonYakobi->Visible=false; ButtonZeydel->Visible=false; ButtonRelax->Visible=true; } // – void __fastcall TForm1: ButtonRelaxClick (TObject *Sender) { //TryStrToFloat (Edit2->Text, e); v_sh=StrToFloat (Edit3->Text); e=StrToFloat (Edit2->Text); Memo1->Lines->Clear(); k=0; for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { TryStrToFloat (StringGrid1->Cells[j] [i], A[i] [j]); } } for (int i=0; i<n; i++) { for (int j=0; j<n+1; j++) { if (A[i] [j]==NULL) { ShowMessage («Ошибка! Есть пустые ячейки!»); fl1=true; i=n; break; } } } if(! fl1) { float vsp=0, alp=0; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (i!=j) B[i] [j]=(-1)*A[i] [j]/A[i] [i]; Else { B[i] [j]=0; C[i]=A[i] [n]/A[i] [i]; } } } float *sq_z=new float[n]; float *sq_y=new float[n]; for (int i=0; i<n; i++) { sq_z[i]=rand(); } for (int i=0; i<n; i++) sq_y[i]=C[i]; for (int i=0; i<n; i++) X[i]=0; vsp=C[0]; for (int j=0; j<n; j++) { vsp+=sq_z[j]*B[0] [j]; } sq_z[0]=vsp; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { vsp+=B[i] [j]; } Y[i]=vsp; vsp=0; } vsp=Y[0]; for (int i=1; i<n; i++) { if (vsp<Y[i]) vsp=Y[i]; Y[i]=0; } if (vsp<1) { do { for (int i=0; i<n; i++) { Y[i]=X[i]; } for (int i=0; i<n; i++) { vsp=C[i]; for (int j=0; j<n; j++) { vsp+=sq_z[j]*B[i] [j]; alp+=B[i] [j]*sq_y[i]; } sq_z[i]=vsp; sq_y[i]=alp+C[i]; vsp=0; alp=0; X[i]=v_sh*sq_z[i]+(1-v_sh)*sq_y[i]; } prov=0; for (int i=0; i<n; i++) { if (fabs(X[i] – Y[i])<e) prov++; } k++; } while (prov!=n); Memo1->Lines->Add (» МЕТОД ВЕРХНЕЙ РЕЛАКСАЦИИ»); Memo1->Lines->Add(«»); String p=»»; Memo1->Lines->Add («Промежуточная матрица:»); for (int i=0; i<n; i++) { p=»»; for (int j=0; j<n+1; j++) { p+=FloatToStr (B[i] [j])+»»; } Memo1->Lines->Add(p); } Memo1->Lines->Add(«»); Memo1->Lines->Add («Корни СЛАУ равны:»); for (int i=0; i<n; i++) { if (X[i]!=NULL) { Memo1->Lines->Add («x»+IntToStr (i+1)+» = «+FloatToStr (X[i])); } Else { Memo1->Lines->Add («Нет корней!»); break; } } Memo1->Lines->Add(«»); Memo1->Lines->Add («Количество итераций = «+FloatToStr(k)); } else {Memo1->Lines->Add («СЛАУ является не сходимой!»);} } } // – Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.05 сек.) |