Смекни!
smekni.com

Итерационные методы решения систем линейных алгебраических уравнений (стр. 2 из 2)

{

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 -0,100000001490 -0,100000001490 0-0,200000002980 0 -0,100000001490 0-0,200000002980 -0,200000002980 0 0Корни СЛАУ равны:x1 = 1x2 = 1x3 = 1,00000011920929Количество итераций = 16 Промежуточная матрица:0 -0,100000001490 -0,100000001490 0-0,200000002980 0 -0,100000001490 0-0,200000002980 -0,200000002980 0 0Корни СЛАУ равны:x1 = 1x2 = 0,99999988079071x3 = 0,999999940395355Количество итераций = 9 Промежуточная матрица:0 -0,100000001490 -0,100000001490 0-0,200000002980 0 -0,100000001490 0-0,200000002980 -0,200000002980 0 0Корни СЛАУ равны:x1 = 1,00000011920929x2 = 0,99999988079071x3 = 0,999999940395355w=1Количество итераций = 9