Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Решение СЛАУ методом матриц отражения


Автор: St. Andrew 2.10.2005, 17:30
Здравствуйте, уважаемые коллеги по вычислительному искусству! Дали мне в универе задание - написать программу, которая вычисляет СЛАУ методом матриц отражения, однако информационная поддержка была представлена в крайне слабом виде. Дали методичку, но там написано все настолько неясно, что считать ее за помощь не приходится. А программу сдавать нужно. В общем, нашел я в Интернете программу, написанную на Си (даже два варианта) и одну - написанную на Бейсике. Программы на Си - слишком сложные для восприятия (там помимо алгоритма - еще всякая лабуда добавлена), а вот на Бейсике - более-менее человечно. Может сможет кто-нибудь перевести ее на Си? Хорошо бы с комментариями smile , но это, я понимаю, уже весьма сложно. Хотелось бы, по крайней мере, иметь работающую программу. Привожу код Бейсика:

Код

REM Гоpкавчук Константин Геоpгиевич
CLS : PRINT "Pешение системы линейных уpaвнений методом отpaжения ."
DEFINT F, H-N, S: DEFSNG A: DEFDBL E, G, P, W-X
INPUT "Введите количество неизвестных: ", N
DIM A(N, N + 1), An#(N, N + 1), U(N, N), W(N), X(N)
H = 7 * (N + 1) + 9: Z$ = STRING$(H, "-")
PRINT Z$: PRINT "|  N'  |   N' Столбца "; TAB(H); "|"
Y$ = STRING$(H - 8, "-"): PRINT "|      |"; Y$
PRINT "|Стpоки|";
FOR I = 1 TO N + 1
  PRINT TAB(7 * I + 5); I; " |";
NEXT
PRINT : PRINT Z$
FOR I = 1 TO N
  PRINT "|  "; I; TAB(8); "|";
  FOR J = 1 TO N + 1
    PRINT TAB(J * 7 + 5); "";
    INPUT ; "", A(I, J)
    PRINT TAB(J * 7 + 9); "|";
  NEXT
  PRINT
NEXT
PRINT Z$
FOR K = 0 TO N - 2
   E = 0
   FOR I = 1 TO N - K
      P(I) = A(I + K, K + 1)
      E = E + P(I) ^ 2
   NEXT
   E = SQR(E)
   P(1) = P(1) - E
   E = SQR(-2 * E * P(1))
   FOR I = 1 TO N - K
      W(I) = P(I) / E
      FOR J = 1 TO N - K + 1
         An#(I, J) = A(I + K, J + K)
      NEXT
   NEXT
   FOR I = 1 TO N - K
      FOR J = 1 TO N - K
         Fin = 0
         IF I = J THEN Fin = 1
         U(I, J) = Fin - 2 * W(I) * W(J)
      NEXT
   NEXT
   FOR I = 1 TO N - K
      FOR J = 1 TO N - K + 1
         E = 0
         FOR L = 1 TO N - K
            E = E + U(I, L) * An#(L, J)
         NEXT
         A(I + K, J + K) = E
      NEXT
   NEXT
   GOSUB SHPIK
NEXT
X(N) = A(N, N + 1) / A(N, N)
FOR I = N - 1 TO 1 STEP -1
   E = 0
   FOR K = I + 1 TO N
      E = E + A(I, K) * X(K)
   NEXT
   X(I) = (A(I, N + 1) - E) / A(I, I)
   X(I) = CSNG(X(I))
NEXT
FOR I = 1 TO N
   PRINT "X("; I; ")="; X(I)
NEXT
END
SHPIK:
  PRINT "Тeкущaя мaтpицa A':"; TAB(N * 13); "Текущaя мaтpицa отpaжения U:"
  PRINT
  FOR L = 1 TO N
    FOR M = 1 TO N
      PRINT TAB(M * 13 - 7); A(L, M);
      PRINT TAB(N * 13 + M * 10 - 3); U(L, M);
    NEXT: PRINT
  NEXT
  PRINT
  FOR O% = 1 TO 8000: NEXT
RETURN


Уж не знаю, работает ли эта конструкция или нет...но ИМХО она еще хотя бы как-то читабельна.

И еще - если кто подкинет ссылочку на нормально разъясненный алгоритм или на книгу по численным методам, то буду тоже очень благодарен! А то как-то трудно писать программу на тему, в которой вообще не сечешь smile
Заранее большое спасибо всем откликнувшимся!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)