Quyidagi tenglamalar sistemasini yechish talab qilingan bo`lsin:
(3.1)
Biz ushbu tenglamalar sistemasini oddiy iteratsiya usuli bilan yechishni uch noma’lumli tenglamalar sisitemasi misolida o`rganamiz.
Bu usulni qo`llashdan avval uni itertsion jarayon uchun qulay ko`rinishda yozib olamiz. Buning uchun sistemadagi har bir tenglamani biror noma`lumga nisbatan yechib olinadi, ya`ni
(3.2)
(4.2) sistemani vektor ko`rinishida ham yozib olish mumkin:
(3.3)
Bu yerda C matritsa va D vektorning elementlarini quyidagi formulalar bilan aniqlanadi:
Iteratsion jarayon yaqinlashuvchi bo`lishi uchun C matritsaning normasi 1 dan kichik bo`lishi lozim, ya`ni
. (3.4)
Oddiy iteratsiya metodining g’oyasi quyidagicha: Dastlab boshlang’ich yaqinlashish tanlab olinadi. So`ngra sistemaning yechimiga ketma-ket yaqishlanishni tashkil qilinadi. Buning uchun navbatdagi k - chi yaqinlashishni topishda (4.2) sistemaning o`ng tomoniga k-1 chi yaqinlashishdagi qiymatlar qo`yiladi. Bu jarayonni matematik formulalar yordamida
(3.5)
tarzida ifodalash mumkin. Iteratsion jarayonni tugatish sharti esa
(3.6)
yoki
ko`rinishida yoziladi.
ZEYDEL METODI
Bu metod oddiy iteratsiya metodidan shunisi bilan farq qiladiki, x1, x2, …, xn noma`lumlarning navbatdagi yaqinlishishini topishda joriy noma`lumdan avval turgan noma`lumlarning yangi qiymatlari va keyin turgan noma`lumlarning eski qiymatlaridan foydalaniladi:
(3.7)
Zeydel iteratsion formulasi oddiy itreratsiyaga nisbatan tezroq yaqinlashishni ta`minlaydi.
Ishning bajarish tartibi
1. Berilgan tenglamalar sistemasini oddiy iteratsiya usuli bilan yeching:
(3.8)
Bu sistemani C++ BUILDER dasrurlash usuli yordamida bajarish ketma-ketligi quyidagi amallardan iborat:
Dastlab (3.8) tenglamalar sistemasidagi xar bir tenglamani alohida bitta noma`lumga nisbatan yechib olamiz:
(3.9)
Endi bu sistemani DELPHI dasturlash tili yordamida Zeydel metodi bilan (3.7) - formuladan foydalanib yechamiz. Soddalik uchun (3.9) ni quyidagi ko’rinishda yozib olamiz:
(3.10)
(3.10) dan ko’rinib turibdiki,
(3.10) tenglamalar sistemasini oddiy iteratsiyasi usuli bilan yechish jarayonini dasturlash quyidagi ketma-ketlikda tashkil qilinadi:
1. interfeys uchun yangi formani yaratish;
2. N sonini aniqlash va formada unga mos jadval shaklini hosil qilish;
3. formaga A jadval va D vektor komponentalarini kiritish;
4. tenglamalar sistemasini berilgan aniqlikda hisoblashni tashkil qilish.
Dastlab, yangi forma yaratiladi va unga 4 ta LABEL, 1 ta EDIT, 2 ta STRINGGRID komponentalari hamda 2-4 bosqichlar uchun zarur bo’lgan 3 ta biyruqli tugmalarni joylashtiramiz. Bu komponentalarning hususiyatlarini 3.1-rasmga mos tartibda o’rnatamiz. Bunga qo’shimcha ravishda STRINGGRID1 va STRINGGRID2 komponentalrining options.goediting, options.gotabs va options.goshowediting hususiatlarini true tarzida o’zgartiriladi.
Dastur listingi quyidagicha:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button3: TButton;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
n : integer ;
d, x, x0, x1 : array [1..20] of double;
a : array [1..20, 1..20] of double;
procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
StringGrid1.ColCount:=n;
StringGrid1.RowCount:=n;
StringGrid1.Width:=(n+1)*47;
StringGrid1.Height:=(n+1)*24;
StringGrid2.RowCount:=n;
StringGrid2.Height:=(n+1)*25;
end;
rocedure TForm1.Button2Click(Sender: TObject);
var i, j: integer;
begin
for j:=1 to n do
for i:=1 to n do
a[i, j]:=StrToFloat(Stringgrid1.Cells[i-1, j-1]);
for i:=1 to n do
d[i]:=StrToFloat(Stringgrid2.Cells[0, i-1]);
end;
procedure TForm1.Button3Click(Sender: TObject);
var t, i, j : integer;
s: real;
begin
for i:=1 to n do x0[i]:=d[i];
t:=0;
while t<>3 do begin
for i:=1 to n do begin
x[i]:=0;
for j:=1 to n do
x[i]:=x[i]+a[j, i]*x0[j];
end;
t:=0;
for i:=1 to n do begin
if (abs(x0[i]-x[i])<=0.001) then t:=t+1;
x0[i]:=x[i];
end;
for i:=1 to n do Label5.Caption:=Label5.Caption+#13+FloatToStr(x[i]);
end;
end ;
end.
Ushbu dastur quyidagi natijani beradi:
Do'stlaringiz bilan baham: |