Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2012, 20:16   #1
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию LU-разложение (Delphi)

доброго времени суток
цель: реализовать метод 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];
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;

end.
P.S сами матрицы L и U проверял, верно составляются
marwell. вне форума Ответить с цитированием
Старый 18.12.2012, 20:38   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Код:
for i:=1 to krat do
for j:=1 to krat do U[i,j]:=a[i,j];
Я думаю, вполне прокатит u:=a;

Цитата:
Код:
L[j,i]:=U[j,i]/U[i,i];
Странно, что правильно формирует L и U. U[j,i] у Вас нигде до этой операции не формируется, а по идее должно быть равно:

Код:
for k:=1 to i-1 do sum:=sum+l[j,k]*u[k,i];
u[j,i]:=a[j,i]-sum;

Цитата:
P.S сами матрицы L и U проверял, верно составляются
И при перемножении дают исходную?
Прикрепите проект к посту, так проще будет разбираться, код у Вас трудновато читается.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.12.2012, 21:05   #3
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Странно, что правильно формирует L и U. U[j,i] у Вас нигде до этой операции не формируется, а по идее должно быть равно:
Цитата:
Код:
for i:=1 to krat do
for j:=1 to krat do U[i,j]:=a[i,j];
Цитата:
Я думаю, вполне прокатит u:=a;
тут в массив u передается исходный массив a

архив прикрепил
Вложения
Тип файла: rar Lu.rar (192.8 Кб, 40 просмотров)
marwell. вне форума Ответить с цитированием
Старый 19.12.2012, 10:20   #4
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Странно, вроде все правильно делаю
marwell. вне форума Ответить с цитированием
Старый 19.12.2012, 10:32   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну вот что у меня из Вашей программы вышло (для проверки разложения я там много чего добавил).

Вывод: при первом нажатии на кнопку корни считаются правильно. Но вот дальше - это непонятная проблема, которую я списал на точность числа с плавающей точкой (они там получаются при разложении) - потому что ничего более адекватного и логичного не придумал. Судите сами: исходные данные - одни и те же, операции над ними тоже, а результат разный. Причем( если верить трассировке) до процедуры LU все нормально, а вот после - расхождения...
Вложения
Тип файла: zip ЧМ лаб 3.zip (242.2 Кб, 66 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.12.2012, 13:47   #6
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

спасибо за ответ! а вывод действительно странный
marwell. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си,Си ++, QR разложение Осип Помощь студентам 1 28.10.2012 16:41
разложение в ряд Фурье(в Delphi) Valechka Помощь студентам 0 13.05.2012 21:26
Разложение в ряд (Delphi) wertret Помощь студентам 3 12.04.2012 14:04
Разложение Avicenna Помощь студентам 2 24.10.2011 08:31
Разложение натурального числа на простые множители (Delphi) giga_person Помощь студентам 3 17.03.2010 16:24