Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Метод последовательного интегрирования |
Автор: АлексейX86 29.8.2015, 18:50 | ||
Нужно вычислить двойной интеграл методом последовательного интегрирования. Делаю так : разбиваю тело интегрирования сечениями, затем считаю площадь каждого сечения как интеграл (по методу Симпсона), и суммирую площади всех сечений. Кол-во шагов разбиений на сечения и в методе Симпсона задаются вводом. Проблема в том, что при разбиении на одно сечение, метод Симпсона при увелечении в нем кол-ва разбиений все увеличивает и увеличивает площадь данного сечения. Можете указать на мою ошибку. Метод Симпсона взят из другого кода, там он считал свой интеграл верно. Из изменений в коде этого метода - добавлено x0 в f.
|
Автор: feodorv 30.8.2015, 00:09 |
У Вас и на первом, и на втором интеграле интервал интегрирования одинаков? Что сразу обращает на себя внимание. Здесь есть умножение на ширину сечения:А здесь нет: ![]() |
Автор: feodorv 31.8.2015, 17:17 | ||||||||
![]() Вы интеграл заменяете на сумму
что есть
Сумму Вы вычисляете. На deltaX не умножаете. И не важно, что в func() Вы снова вычисляете интеграл. И еще. Первый интеграл тоже надо бы посчитать по методу Симпсона ![]()
Вообще не понял,о чем Вы. Если бы Вы делали nOuter = 1, то код выглядел бы так:
Вы же фиксировали nInner в 1, а nOuter меняете, так? Так вот умножать результат (сумму площадей) на stepX надо, чтобы объём получить... |
Автор: АлексейX86 31.8.2015, 17:37 | ||||||
Да, Вы правы, спасибо, исправил.
С учетом Вашей поправки :
и пока без :
программа работает. Но странно, при малом кол-во сечений тела, выходит результат больший, чем сам объем тела. Но если увеличить число сечений (до 100), то интеграл вычилсляется верно. И теперь при фиксированном кол-во сечений, интеграл, считаемый по формуле Симпсона сходится к числу, а не уходит в бесконечность. |
Автор: feodorv 31.8.2015, 17:38 |
А что Вы сделали с solveBy_Simpson??? И почему n имеет тип double??? |
Автор: АлексейX86 31.8.2015, 17:43 |
И все же.... Не могу понять зачем там нужно было на stepX умножать. Вот например есть колбаса у меня. Я ее взвешиваю (m0). Затем я ее нарезаю перпендикулярно на 10 кусков (m1-m10). При нарезке часть колбасы останется на ноже, часть испарится, и т.д. Если я сложу веса всех частей (m1-m10), то я получу m0-погрешность. Вообщем, по такой идее я и писал первую версию программы. Может быть я не учитываю то, при бесконечно малом уменьшении размера ломтя (а соответственно и массы), будет большее кол-во разрезов, и более большая часть массы будет теряться. |
Автор: feodorv 31.8.2015, 17:45 | ||
Совсем не странно. У Вас интегрируемая функция падает что по x, что по y, соответственно, прямоугольники, по которым Вы считаете площадь, будут покрывать все пространство под функцией, да ещё немного выступать - вычисленная площадь получиться больше реальной, да ещё по объему та же ситуация. Добавлено через 2 минуты и 35 секунд Интересно, а то что нужно умножать на h во внутреннем интеграле, Вам понятно? Объем слайса есть его площадь умноженная на толщину этого объема. |
Автор: АлексейX86 31.8.2015, 17:57 |
Все, понял. Я что-то зациклился что толщина сплайса единица, и соответственно домножать не надо.... ![]() |