2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как избежать ошибок округления при решении СЛАУ
Сообщение15.08.2008, 22:38 
Аватара пользователя


17/07/08
322
Пи решении систем уравнений с матрицами коэффициентов, близкими к вырожденным, можно воспользоваться целочисленной арифметикой. Эта идея возникла у меня очень давно, гораздо раньше чем появились ПиСи и Си и Си++. На БЭСМ-6 был реализован алгоритм на Фортране. Листая свои записи я вспомнил о нем и проверил его на современном Inel Fortran под Visual Studio.NET-2008. Оказалось все работает. Думаю что это может пригодиться, тем более что сейчас многие вадеют программированием под MS Visual Studio.NET.

Вот текст:
Код:
      S U B R O U T I N E  LUFACT ( N , LU , IPS , SCALES , IER )
      I M P L I C I T  I N T E G E R * 4 ( A - Z )
C Подпрограмма реализует LU разложение исходной матрицы
C     N - размерность системы уравнений
C     LU- матрица коэффициентов   
C     IPS - вспомогательный массив
C     SCALES - вспомогательный массив
C     IER - индикатор ошибки
       D I M E N S I O N  IPS( N ) , SCALES( 2, N ) , ROWNRM( 2 )
     * , BIG( 2 ) , ISIZE( 2 ), PIVOT( 2 ), EM( 2 ), PC( 2 )
     * , LU( 2, N, N )
C   Начальные установки и поиск ведущего элемента
      IER  =  0
      D O  3  I = 1 , N
      IPS( I ) = I
      ROWNRM( 1 ) = 0
      ROWNRM( 2 ) = 1
      D O  1  J = 1 , N
      IF ( ROWNRM( 1 )*LU( 2 , I , J ) .GE.
     *     ROWNRM( 2 )*IABS(LU( 1 , I , J ) ) ) GO TO 1
      ROWNRM( 1 ) = IABS ( LU( 1 , I , J ) )
      ROWNRM( 2 ) = LU( 2 , I , J )
    1 C O N T I N U E
C    Проверка ведущего элемента
      IF ( ROWNRM( 1 ) )  2 , 1001 , 2
    2 SCALES( 1 , I ) = ROWNRM( 2 )
      SCALES( 2 , I ) = ROWNRM( 1 )
    3 C O N T I N U E
C   Факторизация
      NM1 = N-1
      D O  9  K = 1 , NM1
      BIG( 1 ) = 0
      BIG( 2 ) = 1
      DO 4 I = K , N
      IP = IPS( I )
      ISIZE( 1 ) = IABS ( LU( 1 , IP , K ) )*SCALES( 1 , IP )
      ISIZE( 2 ) = LU( 2 , IP , K )*SCALES( 2 , IP )
      C A L L  SOKRAS ( ISIZE( 1 ) , ISIZE( 2 ) )
      IF ( ISIZE( 1 )*BIG( 2 ) .LE. ISIZE( 2 )*BIG( 1 ) ) GO TO 4
      BIG( 1 ) = ISIZE( 1 )
      BIG( 2 ) = ISIZE( 2 )
      PIVROW = I
    4 C O N T I N U E
C    Проверка на ошибку
      IF ( BIG( 1 ) .EQ. 0 ) GO TO 1002
C    Перестановки
      IF ( PIVROW .EQ. K ) GO TO 5
      J = IPS( K )
      IPS( K ) = IPS( PIVROW )
      IPS( PIVROW ) = J
   5 KP = IPS( K )
      PIVOT( 1 ) = LU( 2 , KP , K )
      IF ( LU( 1 , KP , K ) )  6 , 1002 , 7
    6 PIVOT( 1 ) = -PIVOT( 1 )
    7 PIVOT( 2 ) = IABS(LU( 1 , KP , K ) )
      LU( 1 , KP , K) = PIVOT( 1 )
      LU( 2 , KP , K) = PIVOT( 2 )
      KP1 = K+1
      D O  8  I = KP1 , N
      IP = IPS( I )
      EM( 1 ) = LU( 1 , IP , K )*PIVOT( 1 )
      EM( 2 ) = LU( 2 , IP , K )*PIVOT( 2 )
      C A L L  SOKRAS ( EM( 1 ) , EM( 2 ) )
      LU( 1 , IP , K ) = EM( 1 )
      LU( 2 , IP , K ) = EM( 2 )
      D O  8  J = KP1 , N
      PC( 1 ) = EM( 1 )*LU( 1 , KP , J )
      PC( 2 ) = EM( 2 )*LU( 2 , KP , J )
      C A L L  SOKRAS ( PC( 1 ) , PC( 2 ) )
      LU( 1 , IP , J ) = LU( 1  , IP , J )*PC( 2 )-
     *                   LU( 2  , IP , J )*PC( 1 )
      LU( 2 , IP , J ) = LU( 2  , IP , J )*PC( 2 )
      C A L L SOKRAS ( LU( 1 , IP , J ) , LU( 2 , IP , J ) )
    8 CONTINUE
    9 CONTINUE
C     Перестановки с новым ведущим элементом
      IP = IPS( N )
      PIVOT( 1 ) = LU( 1 , IP , N )
      PIVOT( 2 ) = LU( 2 , IP , N )
      IF( PIVOT( 1 ) ) 10 , 1002 , 11
  10 PIVOT( 2 ) = -PIVOT( 2 )
   11 LU( 1 , IP , N ) = PIVOT( 2 )
      LU( 2 , IP , N ) = IABS( PIVOT( 1 ) )
      R E T U R N
C     Блок регистрации ошибок
1001 IER  =  1
      R E T U R N
C142
1002 IER  =  2
      R E T U R N
      E N D
      S U B R O U T  I N E  LUSOLV ( N , LU , B , X , IPS )
      I M P L I C I T  I N T E G E R * 4 ( A - Z )
C Подпрограмма реализует решение системы ур-ний
C     после  LU разложения исходной матрицы
C     N - размерность системы уравнений
C     LU- матрица коэффициентов   
C     IPS - вспомогательный массив
C     B - вектор правых частей
C     Х - вектор корней системы
C
      D I M E N S I O N  B( 2 , N ) , X( 2 , N ) , IPS( N )
     *                , LU( 2 , N , N ) , ISUM( 2 ) , PC( 2 )
      NP1 = N+1
C144
      IP = IPS( 1 )
      X( 1 , 1 ) = B( 1 , IP )
      X( 2 , 1 ) = B( 2 , IP )
      D O  2  I = 2 , N
      IP = IPS( I )
      IM1 = I-1
      ISUM( 1 ) = 0
      ISUM( 2 ) = 1
      D O  1  J = 1 , IM1
      PC( 1 ) = LU( 1 , IP , J )*X( 1  , J )
      PC( 2 ) = LU( 2 , IP , J )*X( 2  , J )
      C A L L SOKRAS ( PC( 1 ) , PC( 2 ) )
      ISUM( 1 ) = ISUM( 1 )*PC( 2 )+ISUM( 2 )*PC( 1 )
      ISUM( 2 ) = ISUM( 2 )*PC( 2 )
    1 C A L L SOKRAS ( ISUM( 1 ) , ISUM( 2 ) )
      X( 1 , I ) = B( 1 , IP )*ISUM( 2 )-B( 2 , IP )*ISUM( 1 )
      X( 2 , I ) = B( 2 , IP )*ISUM( 2 )
    2 C A L L  SOKRAS ( X( 1 , I ) , X( 2 , I ) )
      IP = IPS( N )
      X( 1 , N ) = X( 1 , N )*LU( 1 , IP , N )
      X( 2 , N ) = X( 2 , N )*LU( 2 , IP , N )
      C A L L SOKRAS ( X( 1 , N ) , X( 2 , N ) )
C145
      D O  4  IBACK = 2 , N
      I = NP1-IBACK
      IP = IPS( I )
      IP1 = I+1
      ISUM( 1 ) = 0
      ISUM( 2 ) = 1
      D O  3  J = IP1 , N
      PC( 1 ) = LU( 1 , IP , J )*X( 1 , J )
      PC( 2 ) = LU( 2 , IP , J )*X( 2 , J )
      C A L L  SOKRAS ( PC( 1 ) , PC( 2 ) )
      ISUM( 1 ) = ISUM( 1 )*PC( 2 )+ISUM( 2 )*PC( 1 )
      ISUM( 2 ) = ISUM( 2 )*PC( 2 )
    3 C A L L  SOKRAS( ISUM( 1 ) , ISUM( 2 ) )
      PC( 1 ) = X( 1 , I )*ISUM( 2 )-X( 2 , I )*ISUM( 1 )
      PC( 2 ) = X( 2 , I )*ISUM( 2 )
      C A L L  SOKRAS ( PC( 1 ) , PC( 2 ) )
      X( 1 , I ) = PC( 1 )*LU( 1 , IP , I )
      X( 2 , I ) = PC( 2 )*LU( 2 , IP , I )
    4 C A L L  SOKRAS( X( 1 , I ) , X( 2 , I ) )
      R E T U R N
      E N D
      S U B R O U T I N E  SOKRAS ( IA , IB )
      I M P L I C I T  I N T E G E R  *  4  ( A - Z )
C     Подпрограмма сокращения дробей
C     IA - числитель (он же носитель знака числа)
C     IB - знаменатель
C
       IF (IA.EQ.0) IB=1
       IF ( IB .LE. 0 ) S T O P  9999
      IK = MIN ( IABS( IA ) , IABS ( IB ) )
      I F ( IK .LE. 1 ) R E T U R N
   99 C O N T I N U E
        LCH = IA/IK
      IF ( LCH*IK .NE. IA ) GO TO 1
        LZN = IB/IK
      IF ( LZN*IK .NE. IB ) GO TO 1
        IA = LCH
        IB = LZN
      GO TO 99
   1  C O N T I N U E
      IK = IK-1
      IF ( IK .GT. 1 ) GO TO 99
      R E T U R N
      E N D

 Профиль  
                  
 
 Re: Как избежать ошибок округления
Сообщение15.08.2008, 23:27 


11/07/06
201
Eugeen1948 писал(а):
Пи решении систем уравнений с матрицами коэффициентов, близкими к вырожденным, можно воспользоваться целочисленной арифметикой.


Не могли бы вы пояснить, что вы имеете в виду. Арифметикой целых чисел?
Или что-то другое? А то очень много вопросов...

 Профиль  
                  
 
 
Сообщение16.08.2008, 01:23 
Модератор
Аватара пользователя


11/01/06
5702
 !  Eugeen1948, заключите свой код в тэг [ code ] .... [ /code ] - тогда и форматирование сохранится.

 Профиль  
                  
 
 
Сообщение16.08.2008, 09:06 
Заслуженный участник


15/05/05
3445
USA
1. На первый взгляд SUBROUTINE BACKW1 с взята откуда-то из другой программы:
- Использование массива LU в BACKW1 не соответствует ее описанию и использованию в остальной части программы.
- В программе описаны LUFACT и LUSOLV, а в BACKW1 используются DECOMP и SOLVE.

2. Ваша практика действительно подтвердила преимущества рациональной арифметики перед арифметикой с плавающей запятой? БЭСМ-6 была, насколько я помню, 48-разрядной. При 7-разрядной мантиссе REAL давал гораздо больший динамический диапазон значений при вполне достойной 40-разрядной мантиссе.

 Профиль  
                  
 
 Подсказка?
Сообщение16.08.2008, 17:50 


03/09/05
217
Bulgaria
По моему Eugeen1948 в свое время пробовал развить программы на ФОРТРАНЕ, описанные в пункте 17 (стр. 84-91) книги Дж. Форсайта и К. Молера "Численное решение систем линейных алгебраических уравнений", изд. "Мир", Москва, 1969.

Она находится и в нашей электронной библиотеке.

Большинство из основных означений совпадает.

Быть может это поможет ему лучше восстановить свою идею.

 Профиль  
                  
 
 Re: Как избежать ошибок округления
Сообщение17.08.2008, 10:52 
Аватара пользователя


17/07/08
322
Really писал(а):
Eugeen1948 писал(а):
Пи решении систем уравнений с матрицами коэффициентов, близкими к вырожденным, можно воспользоваться целочисленной арифметикой.


Не могли бы вы пояснить, что вы имеете в виду. Арифметикой целых чисел?
Или что-то другое? А то очень много вопросов...

На Фортране прижился термин (если хотите - жаргон) где под целочисленной арифметикой понимаются дейcтвия над операндами типа INTEGER.

Добавлено спустя 1 минуту 18 секунд:

maxal писал(а):

Спасибо за замечание. Исправил(ся)!

Добавлено спустя 12 минут 3 секунды:

Yuri Gendelman писал(а):
1. На первый взгляд SUBROUTINE BACKW1 с взята откуда-то из другой программы:
- Использование массива LU в BACKW1 не соответствует ее описанию и использованию в остальной части программы.
- В программе описаны LUFACT и LUSOLV, а в BACKW1 используются DECOMP и SOLVE.

2. Ваша практика действительно подтвердила преимущества рациональной арифметики перед арифметикой с плавающей запятой? БЭСМ-6 была, насколько я помню, 48-разрядной. При 7-разрядной мантиссе REAL давал гораздо больший динамический диапазон значений при вполне достойной 40-разрядной мантиссе.

Спасибо за замечание.
1. Текст исправил.
2. Если Вы еще и вспомните что память на БЭСМ-6 составляла 32000х48 разрядных слов и быстродействие всего ~800000 оп/сек, а операции с челыми числами были примерно на два порядка быстрее чем с с двойной точностью (я это проверял неоднократно) то применение челочисленной арифметики при околовырожденных матрицах давало большие выгоды. Кроме того известно, что для таких плохих матриц может не хватать и учетверенной точности для получения правильного результата из-за катастрофического влияния ошибок округления!

Добавлено спустя 22 минуты 16 секунд:

Re: Подсказка?

Vassil писал(а):
По моему Eugeen1948 в свое время пробовал развить программы на ФОРТРАНЕ, описанные в пункте 17 (стр. 84-91) книги Дж. Форсайта и К. Молера "Численное решение систем линейных алгебраических уравнений", изд. "Мир", Москва, 1969.

Она находится и в нашей электронной библиотеке.

Большинство из основных означений совпадает.

Быть может это поможет ему лучше восстановить свою идею.

Программы матричной алгебры из указанной Вами книги я (думаю что и авторы книги) взял из библиотеки СП ЦЕРНа. Кстати первый Фортран на БЭСМ-6 так и назывался - Фортран-ЦЕРН. Моя работа начиналась в ИАЭ им. И.В. Куратова, где стояла одна из первых БЭСМ-6 и была хорошая библиотека математических программ на Фортране, основу которой составляли ЦЕРНовские программы.
А сами программы с плавающей точкой я использовал как тест при решении одной и той же задачи. Ведь часто заранее не известно какова матрица и тесты всегда полезны.
Вот и "затесались" у меня ссылки на них (еще раз извиняюсь) не по делу.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Andrei P


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group