Собственно есть задача, полную ее суть писать не стану,но проблема заключается в следующем нужно с помощью LU разложения решить систему.Рабочий код на С++ у меня был и я его попытался перенести на Delphi.Но к несчастью моя затея обернулась неудачей.
type TVec = array of Extended; // векторный тип TMatr = array of TVec; // матричный тип
function LUrazl(matr: Tmatr): Tvec; var i, j,k, row, col: Word; res: TVec; _matr_: TMatr; L,U: TMatr; Sum: double; begin _matr_ := CopyMatr(matr); // Copy не работает как надо row := Length(_matr_); col := Length(_matr_[0]); SetLength(L,row,col); SetLength(U,row,col); if row <> col-1 then ShowMessage('Ошибка: некорректные размерности матрицы! (МГ)'); //error for i:=0 to row-1 do for j:= 0 to col-1 do begin L [i][j] := 0; U [i][j] := 0;
if i = j then L [i][j] := 1; end;
//==============================================
//находим первый столбец L[][] и первую строку U[][]
for i:= 0 to row-1 do begin L [i][0]:= _matr_ [i][0]/ _matr_ [0][0]; U [0][i]:= _matr_ [0][i] / L [0][0]; end;
for i:= 0 to row-1 do begin for j:= 0 to col-1 do begin U [0][ i] := _matr_[0][ i]; L [i][ 0] := _matr_[i][ 0] / U[0][ 0]; sum := 0; for k:= 0 to i do begin sum :=sum+ L[i][ k] * U[k][ j]; end; U[i][ j] := _matr_[i][ j] - sum; if (i > j) then L[j][ i] := 0 else begin sum := 0; for k:= 0 to i do begin sum:=sum+L[j][ k] * U[k][ i]; end; L[j][ i] := (_matr_[j][ i] - sum) / U[i][ i];//В этой строке выдает деление на ноль так же в дебаге видно,что значение i=65000+ end;
end; res[i]:= U[i][ i]; end; end;
Непонятна причина такого поведения,ведь на С++ все это работало.Если надо могу добавить файл целиком.