Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Схема Халецкого (http://www.tehnari.ru/f41/t99239/)

Charlotte 04.11.2014 00:03

Схема Халецкого
 
Вложений: 2
доброй ночи, уважаемые форумчани. Помогите, пожалуйста, решить задание с помощью схемы Халецкого.

задание:
Вложение 202146

и
Вложение 202147


заранее огромное спасибо за помощь!!!

Gruvi 04.11.2014 16:34

Вот полноценный метод Халецкого реализованный на Delphi.
Цитата:

procedure TForm1.Button1Click(Sender: TObject);
type
Vector = array of Double;
Matrix = array of Vector;

procedure Holetsky(n : Integer; A0 : Matrix; B0, X : Vector; var Error : Double);
var
i, j, m, k, p : Byte;
s, e, maxVal : Double;
A : Matrix;
begin
SetLength(A, n + 1, n + 1);
for i := 0 to pred(n) do
for j := 0 to pred(n) do
A[i, j] := A0[i, j];

for i := 0 to Pred(n) do A[i, n] := B0[i];
for i := 0 to Pred(n) do
begin
maxVal := 0;
for j := i to Pred(n) do
if maxVal < Abs(A[i, j]) then
begin
maxVal := Abs(A[i, j]);
p := j;
end;

if p <> i then
begin
for j := 0 to n do A[n, j] := A[i, j];
for j := 0 to n do A[i, j] := A[p, j];
for j := 0 to n do A[p, j] := A[n, j];
end;
end;

for j := 1 to n do A[0, j] := A[0, j] / A[0, 0];
for m := 1 to Pred(n) do
begin
for i := m to Pred(n) do
begin
s := 0;
for k := 0 to Pred(m) do s := s + A[i, k] * A[k, m];
A[i, m] := A[i, m] - s
end;
for j := m + 1 to n do
begin
s := 0;
for k := 0 to Pred(m) do s := s + A[m, k] * A[k, j];
A[m, j] := (A[m, j] - s) / A[m, m]
end;
end;
X[n-1] := A[n-1, n];
for i := n - 2 downto 0 do
begin
s := 0;
for k := i + 1 to Pred(n) do s := s + A[i, k] * X[k];
X[i] := A[i, n] - s
end;

error := 0;
for i := 0 to Pred(n) do
begin
s := 0;
for j := 0 to Pred(n) do
if i = j then
s := s + (A0[i, j] + 1) * X[j]
else
s := s + A0[i, j] * X[j];
s := s - B0[i];
error := Max(error, Abs(X[i] - s));
end;
SetLength(A, 0, 0);
end;

var
A : Matrix;
B, X : Vector;
err : Double;
i, j, n : Integer;
begin
n := StrToInt(Edit3.Text);
SetLength(A, n + 1, n + 1);
SetLength(B, n + 1);
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
begin
A[i, j] := StrToFloat(sgA.Cells[j, i]);
end;
B[i] := StrToFloat(sgB.Cells[0, i]);
end;

SetLength(X, n + 1);
Holetsky(N,A,B,X,err);

for i := 0 to Pred(n) do
sgRes.Cells[0, i] := FloatToStr(X[i]);
ShowMessage(Format('Error = %f', [Err]));

SetLength(X, 0);
SetLength(B, 0);
SetLength(A, 0, 0);
end;

// При создании формы заполняю вектор B
procedure TForm1.FormCreate(Sender: TObject);
begin
sgB.Cells[0, 0] := FloatToStr(4*sin(4));
sgB.Cells[0, 1] := FloatToStr(5*(sin(4) - cos(4)));
sgB.Cells[0, 2] := FloatToStr(7*(cos(4) + sin(4)));
sgB.Cells[0, 3] := FloatToStr(3*sin(4));
end;


Часовой пояс GMT +4, время: 17:01.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.