IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> LU разложение.
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Собственно есть задача, полную ее суть писать не стану,но проблема заключается в следующем нужно с помощью 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;


Непонятна причина такого поведения,ведь на С++ все это работало.Если надо могу добавить файл целиком.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
К несчастью так нельзя,когда мы самый первый раз заходим в цикл по i у нас i=0, и i-1 в цикле по K мне даст большую беду
Бла-бла-бла... Кроме Word-а в Дельфи есть еще и Integer, который способен принимать отрицательные значения. Чуешь, откуда ошибка?

В общем, вот, прогнал на FPC твой дельфийский код, ничего не вылетает, печатает то, что приведено выше:

type
TVec = array of Extended;
TMatr = array of TVec;

procedure LUrazl(_matr_: Tmatr; var L, U : TMatr);
var
i, j, row, col: Word;
k : integer;
res: TVec;
Sum: double;
begin
// _matr_ := CopyMatr(matr);
row := Length(_matr_);
col := Length(_matr_[0]);
SetLength(L,row,col);
SetLength(U,row,col);
if row <> col-1 then
writeln('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;

//==============================================

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-1 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-1 do
begin
sum:=sum+L[j][ k] * U[k][ i];
end;
L[j][ i] := (_matr_[j][ i] - sum) / U[i][ i];
end;
end;
end;
end;

var
A : tmatr;
L, U : tMatr;
i, j : integer;

begin
setlength(a, 4, 4);

a[0, 0] := 2; a[0, 1] := -5; a[0, 2] := 6; a[0, 3] := 1;
a[1, 0] := -16; a[1, 1] := 48; a[1, 2] := -55; a[1, 3] := -5;
a[2, 0] := 0; a[2, 1] := 24; a[2, 2] := -25; a[2, 3] := 10;
a[3, 0] := 8; a[3, 1] := 21; a[3, 2] := 30; a[3, 3] := 4;

LURazl(A, L, U);

writeln('L-matrix:');
for i := 0 to Length(L) - 1 do
begin
for j := 0 to Length(L[0]) - 1 do
write(L[i, j]:10 :4);
writeln;
end;
writeln('U-matrix:');
for i := 0 to Length(U) - 1 do
begin
for j := 0 to Length(U[0]) - 1 do
write(U[i, j]:10 :4);
writeln;
end;

end.
Дельфи запускать лень smile.gif

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.06.2024 8:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name