доброго времени суток цель: реализовать метод LU-разложения для решения СЛАУ размерности 6х6 метод несложный, вроде все верно делаю, а корни неправильные получаются сама матрица передается в ish_matr, свободные члены в svob_koeffs
type Tmass=array[1..100] of double; Tmatrix=array[1..100,1..100] of double; var Form1: TForm1; korni,z:Tmass; ish_matr:TMatrix; svob_koeffs:TMass; L,U: TMatrix;
const krat=6;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
procedure LU(a:TMatrix; free:TMass);
function sum_korni(i,f:integer):double; var j:integer; s:double; begin s:=0; case f of 0: for j:=1 to i-1 do s:=s+z[j]*L[i,j]; 1: for j:=i+1 to krat do s:=s+korni[j]*U[i,j]; end; Result:=s; end;
var i,j,k:integer; begin for i:=1 to krat do for j:=1 to krat do U[i,j]:=a[i,j]; for i:=1 to krat do begin for j:=i to krat do begin L[j,i]:=U[j,i]/U[i,i]; end; end; for k:=2 to krat do begin for i:=k-1 to krat do for j:=i to krat do L[j,i]:=U[j,i]/U[i,i]; for i:=k to krat do for j:=k-1 to krat do U[i,j]:=U[i,j]-L[i,k-1]*U[k-1,j]; end; z[1]:=free[1]/L[1,1]; for i:=2 to krat do begin z[i]:=(free[i]-sum_korni(i,0))/L[i,i]; end; korni[krat]:=z[krat]/U[krat,krat]; for i:=krat-1 downto 1 do begin korni[i]:=z[i]-sum_korni(i,1); end; end;
var i, j: integer; begin ... LU(ish_matr,svob_koeffs); Memo1.Clear; for i:=1 to 6 do Memo1.Lines.Add('p['+IntToStr(i)+']='+FloatToStrf(korni[i], ffGeneral, 8, 3)); end;