Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение СЛАУ методом матриц отражения, Нужна программа на Си... 
:(
    Опции темы
St. Andrew
Дата 2.10.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.3.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 8



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

Это сообщение отредактировал(а) St. Andrew - 2.10.2005, 19:39
--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.