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



Заффтра сдавать...
paste.org.ru/?m0fol8
И еще я не пойму - вот уже второй раз пытаюсь код тут выложить. А половина его почему-то исчезает.
Если да, то это результат деления на ноль. Деление в программе только одно, в строке (79) xn[i]/=-a[i][i];
Не вижу проверки a[i][i] на "нулевость". В любом случае такая проверка не помешает.
Меня интересует другое. Если всё так срочно, где же автор поста?)
А нормально расставит, например, Visual Studio.
Вообще на разных системках может по разному сходится или расходится. Кол-во уравнений системы - 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
еретичные значения выглядят так: "1.#INF" ? - да да, именно так в конце. До этого еще вылезают какие-то +100.
Не вижу проверки a[i][i] на "нулевость". В любом случае такая проверка не помешает. - проверки нет, это да. Не помешает - сделаю. Но там в душе этот коэффициент не может быть равен нулю и не равен никогда - это коэффициент матрицы, которая в итерационном процессе никак не меняется вообще. Если правда результат деления на ноль - то не здесь, явно. Еще там деление когда тау вычисляю. Это в функции реализации самого метода.
Вот paste.org.ru/?h6d7zl
А нас на курсах палками бьют, если отступы не ставим..)
А нас на курсах палками бьют, если отступы не ставим - а что такое вообще отступы?
Вот только что с самой программкой-то?...
Матушка Ветровоск, я сражен подменой кода. Прихожу в себя)))))
я не такая блондинка как кажетсяmistificator, проститеизвините
Еще вычислила вручную значение на первой итерации, т.е. каким должен получится первый самый вектор приближения:
2,0730445
2,33217507
5,18261126
А в проге получается уже на первой итерации совсем другое значение - видимо не только в делении на 0 проблема.
x1 = 1.9092
x2 = 3.19496
x3 = 5.04481
В этом должно получиться сто-то вроде этого.
А для первой системки коэффициентов точное решение - (2,1,2).
Все это - с точностью 0.0001.
надо переправить на 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
точно не блондинка? - очень темная шатенка, просто законченный гуманитарий и ходячая локальная катастрофа для компиляторов - уже то, что я этот еретичный код сама написала стало для меня великим подвигом
Сошлось все и для второй системы. Я просто безмерно обязана... Вам, и вообще всем, кто пытался помочь - я у вас в долгу огромном преогромном
Касательно кода ещё. Меня беспокоит, что в коде повсеместно стоят операторы new, и нет ни одного delete. Это С++, а не С#, тут Билл Гейтс за вас память не почистит.
Придумаю вам страшное наказание