Здравствуйте, уважаемые коллеги по вычислительному искусству! Дали мне в универе задание - написать программу, которая вычисляет СЛАУ методом матриц отражения, однако информационная поддержка была представлена в крайне слабом виде. Дали методичку, но там написано все настолько неясно, что считать ее за помощь не приходится. А программу сдавать нужно. В общем, нашел я в Интернете программу, написанную на Си (даже два варианта) и одну - написанную на Бейсике. Программы на Си - слишком сложные для восприятия (там помимо алгоритма - еще всякая лабуда добавлена), а вот на Бейсике - более-менее человечно. Может сможет кто-нибудь перевести ее на Си? Хорошо бы с комментариями , но это, я понимаю, уже весьма сложно. Хотелось бы, по крайней мере, иметь работающую программу. Привожу код Бейсика:
| Код | 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
|
Уж не знаю, работает ли эта конструкция или нет...но ИМХО она еще хотя бы как-то читабельна.
И еще - если кто подкинет ссылочку на нормально разъясненный алгоритм или на книгу по численным методам, то буду тоже очень благодарен! А то как-то трудно писать программу на тему, в которой вообще не сечешь Заранее большое спасибо всем откликнувшимся! |