Не трать впустую (с)
В общем, есть код - страшный и непонятный. Чисто теоретически он должен реализовать метод минимальной невязки. Метод очень хорошо описан здесь, именно по этим алгоритмам и пошаговой инструкции я и делала: www.physchem.chimfak.rsu.ru/Source/NumMethods/S...
Единственное чего там нет - правила останова. В программе оно должно быть следующим: итерационный процесс прекращается, когда значение нормы вектора невязки, деленного на кол-во уравнений системы, становится меньше заданного эпсилон.
Код был написан с трудом... Даже убиты в нем все ошибки. И он даже работает. И итерационный процесс даже сходится. Но сходится откровенно говоря лево. Ибо итерации переваливают за сотню - другую, а значения неизвестных на них получаются еретичные: со знаками #. Тут два варианта. Либо обе системы, на которых я проверяю прогу, для метода невязки расходятся, либо в проге какая-то серьезная ошибка. Которую найти я так и не смогла. Зная, какой я программист, подразумеваю все-таки второе. Выкладываю код проги, по возможности с пояснениями. Сам метод невязки простенький, в нем легко разобраться. Помогите, пожалуйста, найти ошибку - очень надо, и чем скорее, тем лучше.
Код целиком почему-то не влезает в пост О_о Вот выложила paste.org.ru/?6svwm8, спасибо  slackovod за совет.
читать дальше
Все. Очень сильно нужна ваша помощь :depress2:
:depress2:SOS:depress2:
Заффтра сдавать...


@темы: Работа

Комментарии
06.10.2008 в 01:02

просьба перевыложить через paste.org.ru
06.10.2008 в 01:10

Не трать впустую (с)
Эм... Пардон, с данной программой/сайтом не встречалась раньше - надеюсь, выложила правильно.
paste.org.ru/?m0fol8
И еще я не пойму - вот уже второй раз пытаюсь код тут выложить. А половина его почему-то исчезает. :hmm: То что висит сейчас в после - это треть примерно. Я что-то не так делаю, или... я что-то не так делаю?...
06.10.2008 в 01:22

капелюх чарiвника
Матушка Ветровоск, дайте типичные входные данные, и хотя бы что приблизительно должно получаться на выходе.
06.10.2008 в 01:38

капелюх чарiвника
Матушка Ветровоск, еретичные значения выглядят так: "1.#INF" ?
Если да, то это результат деления на ноль. Деление в программе только одно, в строке (79) xn[i]/=-a[i][i];
Не вижу проверки a[i][i] на "нулевость". В любом случае такая проверка не помешает.
06.10.2008 в 11:53

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Абр... Отступы рандомом расставлялись?
06.10.2008 в 13:06

капелюх чарiвника
Ну, редакторы с автоформатированием вроде нынче не проблема =)

Меня интересует другое. Если всё так срочно, где же автор поста?)
06.10.2008 в 13:24

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
mistificator, покажи мне такой редактор, который ТАК отступы расставит) Чтобы было максимально непонятно)
06.10.2008 в 20:07

капелюх чарiвника
[revolver], не, вот так отступы расставит копипаст))
А нормально расставит, например, Visual Studio.
07.10.2008 в 17:00

Не трать впустую (с)
mistificator
Вообще на разных системках может по разному сходится или расходится. Кол-во уравнений системы - 3. Вот примеры коэффициентов:
6 -2 1 11
-2 7 2 5
1 2 -5 -1
Или можно:
4 0.24 -0.08 8
0.09 3 -0.15 9
0.04 -0.08 4 20
07.10.2008 в 17:03

Не трать впустую (с)
mistificator
еретичные значения выглядят так: "1.#INF" ? - да да, именно так в конце. До этого еще вылезают какие-то +100.
Не вижу проверки a[i][i] на "нулевость". В любом случае такая проверка не помешает. - проверки нет, это да. Не помешает - сделаю. Но там в душе этот коэффициент не может быть равен нулю и не равен никогда - это коэффициент матрицы, которая в итерационном процессе никак не меняется вообще. Если правда результат деления на ноль - то не здесь, явно. Еще там деление когда тау вычисляю. Это в функции реализации самого метода.
07.10.2008 в 17:04

Не трать впустую (с)
Если всё так срочно, где же автор поста?) - йа туд, не бейте меня тапками :aaa: Я не мог появится физически\ Мне бы эту ересь исправить уже завтра - ибо сдавать в среду, а там еще один метод вбивать.
07.10.2008 в 17:05

Не трать впустую (с)
Отступы рандомом расставлялись? - а кто такие отступы? :shuffle2:
07.10.2008 в 17:07

Не трать впустую (с)
Насчет входных данных - в принципе, должно работать с любой СЛАУ из трех уравнений, особенно хорошо если с диагональным преобладанием. Нет, ну вообще работать должно со всем - просто с чем-то расходиться. Но и с теми двумя системами сойтись должно. Вроде.:hmm:
07.10.2008 в 17:19

Не трать впустую (с)
Фу, млин - я растыко несчастное :uzhos: Можно уже и тапками *хотя сама убьюсь ап стену*
Вот paste.org.ru/?h6d7zl
07.10.2008 в 17:22

капелюх чарiвника
сдаётся мне, это другой код =)
07.10.2008 в 17:32

Псих
> Отступы рандомом расставлялись? - а кто такие отступы?
А нас на курсах палками бьют, если отступы не ставим..)
07.10.2008 в 17:50

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Crazy Wizard, правильно делают. Я даже не смотрю программу, если там нету отступов
07.10.2008 в 17:58

Псих
[revolver], знаю что правильно. Я когда начинал программировать - сразу же освоил технологию отступов) Сам же не найдёшь ничего, если не форматировать правильно..
07.10.2008 в 18:12

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Crazy Wizard, угу. Достаточно написать проект крупный и начинаешь всё сам делать. Отступы, нормальные названия переменным, пространства имён, иерархия классов нормальная и т.д. У меня это было приложение, взаимодействующее с СУБД, ну и компилятор отчасти)
07.10.2008 в 18:26

Не трать впустую (с)
сдаётся мне, это другой код =) - к сожалению, это тот, который нужен. :depress2: Хотя я совершенно точно помню, что выгружала нужный код - как там оказалось то, что оказалось - не представляю :depress2: Я дико извиняюсь :depress2:
А нас на курсах палками бьют, если отступы не ставим - а что такое вообще отступы? :hmm: Это когда отспупают в начале новой строки кода? Вы уж извините, что у меня этого нет :depress2: - ибо не учили нас этому. И вообще ничего про это не говорили. :depress2:
07.10.2008 в 19:07

Псих
Матушка Ветровоск, да, это когда отступают в начале новой строки. Для программиста знать как ставить отступы и ставить их - обязательное условие. ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B8%D0%BB%...
07.10.2008 в 19:09

Не трать впустую (с)
Crazy Wizard, к счастью, я не программист, а математик-теоретик. Но я обязательно прочту и учту - и на будущее постараюсь правильно расставлять отступы. Спасибо.
Вот только что с самой программкой-то?... :hmm:
07.10.2008 в 19:30

капелюх чарiвника
если редактировать исходник в блокноте, то да, без отступов никуда, и сами они не появятся. только скорость изготовления кода падает в несколько раз. надеюсь, никто не пишет код в блокноте?))

Матушка Ветровоск, я сражен подменой кода. Прихожу в себя)))))
07.10.2008 в 19:35

Не трать впустую (с)
никто не пишет код в блокноте - нет, я пишу в Dev-Cpp, на крайтий случай в Код Блоксе:shuffle2: Правда :shuffle2: я не такая блондинка как кажется
mistificator, проститеизвините :depress2:Я, честное слово, не понимаю, как там оказался тот код - я точно помню, что вставляла именно нужный... Короче все как всегда:depress2:
07.10.2008 в 19:35

Псих
mistificator, если бы блокнот виндоуса подсвечивал код и умел компилировать C/C++...
08.10.2008 в 20:25

Не трать впустую (с)
Народ! Нашла ошибку в коде в 118 строке - перезалила его на paste.org.ru : paste.org.ru/?6svwm8 - фот :depress2: Но легче от этого не стало.
Еще вычислила вручную значение на первой итерации, т.е. каким должен получится первый самый вектор приближения:
2,0730445
2,33217507
5,18261126
А в проге получается уже на первой итерации совсем другое значение - видимо не только в делении на 0 проблема.
08.10.2008 в 20:33

Не трать впустую (с)
Еще вот что может быть полезно: для второй системы коэффициентов итерационный мятод Якоби сходится на значениях:
x1 = 1.9092
x2 = 3.19496
x3 = 5.04481
В этом должно получиться сто-то вроде этого.
А для первой системки коэффициентов точное решение - (2,1,2).
Все это - с точностью 0.0001.
08.10.2008 в 22:25

капелюх чарiвника
в строке (54) исходника не инициализирована переменная, написано double s;
надо переправить на double s = 0;
решение первой системы (2, 1, 1), которое программа и выдаёт с заданной точностью 0.0001 на итерации номер 30. точно не блондинка?

Number of iteration0
x[0] = 1.8247
x[1] = 0.829409
x[2] = -0.165882

...

Number of iteration30
x[0] = 1.99919
x[1] = 0.999628
x[2] = 0.997694
08.10.2008 в 22:47

Не трать впустую (с)
mistificator, отныне моя душа принадлежит вам :beg:
точно не блондинка? - очень темная шатенка, просто законченный гуманитарий и ходячая локальная катастрофа для компиляторов - уже то, что я этот еретичный код сама написала стало для меня великим подвигом :wow:
Сошлось все и для второй системы. Я просто безмерно обязана... Вам, и вообще всем, кто пытался помочь - я у вас в долгу огромном преогромном :beg:
08.10.2008 в 23:13

капелюх чарiвника
Матушка Ветровоск, шатенка — это гут)) Не принижайте свои способности, реализовать алгоритм по его текстовому описанию — это мощно. И я рад, что повозился с этим кодом, хоть вспомнил, как перемножаются матрицы и векторы.
Касательно кода ещё. Меня беспокоит, что в коде повсеместно стоят операторы new, и нет ни одного delete. Это С++, а не С#, тут Билл Гейтс за вас память не почистит.

Придумаю вам страшное наказание ;-)