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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Решение СЛАУ методом LU-разложнеия
legend-muay
сообщение 31.10.2009 4:21
Сообщение #1





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

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


Помогите найти ошибку в программе
При числах меньше 10 работает нормально, если есть числа больше 10 начинает работать неправильно

matr=array[1..100,1..100] of extended;
TResult=array[1..100]of extended;
const
eps=1e-12;
{
Раскаладывает матрицу А на произведение LU
А= L11 U12 U13 {n=3}
L21 L22 U23
L31 L32 L33
}
function LUDecomposition(var a:matr;n:word):boolean;
var i,j,k:word;
s:extended;
u,l:matr;
begin
if abs(a[1,1])<eps then
begin
LUDecomposition:=false;
exit;
end;
for i:=2 to n do
for k:=2 to n do
begin
if abs(a[i,i])<eps then
begin
LUDecomposition:=false;
exit;
end;
a[1,k]:=a[1,k]/a[1,1];
if k<=i then
begin
s:=0;
for j:=1 to k-1 do
s:=s+a[i,j]*a[j,k];
a[i,k]:=a[i,k]-s;
end
else
begin
s:=0;
for j:=1 to i-1 do
s:=s+a[i,j]*a[j,k];
a[i,k]:=(a[i,k]-s)/a[i,i];
end;
end;
if abs(a[n,n])<eps then
begin
LUDecomposition:=false;
exit;
end;
LUDecomposition:=true;
end;

{
раскладываем A на L и U
L= L11 0 0
L21 L22 0
L31 L32 L33

U= 1 U12 U13
0 1 U23
0 0 1
}
procedure Decomposition(a:matr;n:byte;var NewL,NewU:matr);
var i,j:word;
begin
for i:=1 to n do
for j:=1 to n do
begin
if i>=j
then
begin
NewL[i,j]:=a[i,j];
if i=j then NewU[i,j]:=1
else NewU[i,j]:=0;
end
else
begin
NewU[i,j]:=a[i,j];
NewL[i,j]:=0;
end;
end;
end;

{
Обратный ход для
Ly=b
Ux=y
}
procedure BackStep(a:matr;b:TResult;n:byte;flag:char;var res:TResult);
var i,j,k:word;
s:extended;
begin
if flag in['U','u'] then
begin
res[n]:=b[n]/a[n,n];
for i:=n-1 downto 1 do
begin
s:=0;
for j:=i+1 to n do
s:=s+(a[i,j]*res[j]);
res[i]:=(b[i]-s)/a[i,i];
end;
end;
if flag in['L','l'] then
begin
res[1]:=b[1]/a[1,1];
for i:=2 to n do
begin
s:=0;
for j:=1 to i-1 do
s:=s+(a[i,j]*res[j]);
res[i]:=(b[i]-s)/a[i,i];
end;
end;
end;
{
Основная ПП
}
begin
read_matrix(n,a,b);{считываем матрицу и столбец свободных членов}
if LUDecomposition(a,n)=false then exit;
Decomposition(a,n,l,u);
BackStep(l,b,n,'l',y);
BackStep(u,y,n,'u',x);
end.



Сообщение отредактировано: Lapp - 31.10.2009 5:23


Прикрепленные файлы
Прикрепленный файл  LUH.rar ( 210.1 килобайт ) Кол-во скачиваний: 152
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
legend-muay
сообщение 31.10.2009 11:12
Сообщение #2





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

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


Все разобрался
Код

function LUDecomposition(var a:matr;n:word):boolean;
var i,j,k:word;
    s:extended;
    u,l:matr;
begin
if abs(a[1,1])<eps then
  begin
   LUDecomposition:=false;
   exit;
  end;
for k:=2 to n do
a[1,k]:=a[1,k]/a[1,1];
for i:=2 to n do
begin
  if abs(a[i,i])<eps then
   begin
    LUDecomposition:=false;
    exit;
   end;
  for k:=2 to n do
    if k<=i then
     begin
      s:=0;
      for j:=1 to k-1 do
       s:=s+a[i,j]*a[j,k];
      a[i,k]:=a[i,k]-s;
     end
      else
       begin
        s:=0;
        for j:=1 to i-1 do
         s:=s+a[i,j]*a[j,k];
        a[i,k]:=(a[i,k]-s)/a[i,i];
       end;
end;
if abs(a[n,n])<eps then
  begin
   LUDecomposition:=false;
   exit;
  end;
LUDecomposition:=true;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 18.07.2025 14:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"