АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Применение метода к конкретной задаче (анализ)

Читайте также:
  1. II. Документация как элемент метода бухгалтерского учета
  2. Алгебраическое описание метода
  3. Алгоритм метода ветвей и границ
  4. Анализ стандарта по методам статистического контроля и регулирования техпроцессов
  5. Анамнез и его разделы. Приоритет отечественной медицины в разработке анамнестического метода. Понятие о наводящих вопросах: прямых и косвенных.
  6. Анизотропия. Выявление анизотропии свойств геологических переменных методами геостатистики.
  7. Ароматические углеводороды (арены). Бензол, электронное и пространственное строение. Промышленное получение и применение бензола. Гомологи бензола.
  8. Базовые концепции и принципы менеджмента качества: «Кайдзен», TQM, TPS, ISO 9001-2008 и их применение в индустрии гостеприимства
  9. Блок схемы для каждого метода решения
  10. Бортовые отсосы. Кольцевые отсосы. Применение. Классификация. Конструирование
  11. В-89 Применение права как особая форма реализации права?
  12. Вкажіть, які методики відповідають основним методам копроскопічної діагностики за гельмінтозів.

Составляя задачи на языке программирования Borland C++ Builder 6 для реализации точных методов решения СЛАУ я учитывал разное количество уравнений в системе (размерность матрицы задавал равным nxn). Но для проверки результатов использовал систему уравнений:

 

 

Вообще говоря, процесс Зейделя сходится быстрее, чем метод Якоби. Бывает, что процесс Зейделя сходится, когда простая итерация расходится и т.п. Правда, бывает и наоборот. Во всяком случае, достаточные условия сходимости для метода Якоби достаточны и для сходимости метода Зейделя. Реализовав программы из полученного ответа я увидел, что процесс Зейделя сходится быстрее. Это видно по количеству итераций полученных в программе при приближенной точности =0,000001. Если для метода Якоби они составляют 16, то для метода Зейделя они составляют 9.

Также рассматривая метод верхней релаксации и сравнивая его с двумя другими методами видно, что в методе верхней релаксации количество итераций зависит от заданного числового параметра w. Задавая w=1, количество итераций равно 9, уменьшая значение параметра от 1 количество итераций начинает расти, в свою очередь увеличивая параметр количество итераций тоже начинает расти.

Приведем таблицу показывающих количество итераций (k) при разных значениях параметра w:

 

w 0.1 0.4 0.8 0.9   1.1 1.2 1.3 1.7 1.9
k                    

 

Из всего этого можно сделать вывод, что итерационные методы сходятся быстрее, чем точные методы, о чем свидетельствуют как быстрое уменьшение невязок, так и уменьшение изменений неизвестных.

Листинг программы

// –

#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 («СЛАУ является не сходимой!»);}

}

}

// –


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.05 сек.)