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
5710
 !  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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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