![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
АлексейX86 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
Нужно вычислить двойной интеграл методом последовательного интегрирования.
Делаю так : разбиваю тело интегрирования сечениями, затем считаю площадь каждого сечения как интеграл (по методу Симпсона), и суммирую площади всех сечений. Кол-во шагов разбиений на сечения и в методе Симпсона задаются вводом. Проблема в том, что при разбиении на одно сечение, метод Симпсона при увелечении в нем кол-ва разбиений все увеличивает и увеличивает площадь данного сечения. Можете указать на мою ошибку. Метод Симпсона взят из другого кода, там он считал свой интеграл верно. Из изменений в коде этого метода - добавлено x0 в f.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
У Вас и на первом, и на втором интеграле интервал интегрирования одинаков?
Что сразу обращает на себя внимание. Здесь есть умножение на ширину сечения:А здесь нет: ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
АлексейX86 |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
Да, но должно быть так :
(иксы уже при отладке появились, с игреками соответственно - не работает тоже)
Насколько я понимаю, так и должно быть, в обоих методах. В формуле Симпсона это ясно. А в методе solveBy_StepStrip в summ просто накапливается площадь сечений тела интегрирования, домножать в конце не надо. О алгоритме : ![]() Делаю nOuter сечений тела интегрирования. Затем площадь каждого сечения вычисляю как интеграл от f(x0,y), где x0 - данное сечение, в пределах от y1 до y2. Эта площадь считается по формуле Симпсона, где кол-во шагов есть nInner. Затем суммирование площадей всех сечений. Провел тест : nOuter = 1, при увеличении nInner площадь сечения увеличивается в бесконечность (на 1-ом шаге площадь сечения БОЛЬШЕ чем значение двойного интеграла). (Может функция где-то на бесконечность уходит, но вроде бы на заданных промежутках такого нету) График подынтегральной функции : ![]() Полный код
Это сообщение отредактировал(а) АлексейX86 - 31.8.2015, 13:46 |
||||||||
|
|||||||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
![]() Вы интеграл заменяете на сумму
что есть
Сумму Вы вычисляете. На deltaX не умножаете. И не важно, что в func() Вы снова вычисляете интеграл. И еще. Первый интеграл тоже надо бы посчитать по методу Симпсона ![]() Вообще не понял,о чем Вы. Если бы Вы делали nOuter = 1, то код выглядел бы так:
Вы же фиксировали nInner в 1, а nOuter меняете, так? Так вот умножать результат (сумму площадей) на stepX надо, чтобы объём получить... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
АлексейX86 |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
Да, Вы правы, спасибо, исправил.
С учетом Вашей поправки :
и пока без :
программа работает. Но странно, при малом кол-во сечений тела, выходит результат больший, чем сам объем тела. Но если увеличить число сечений (до 100), то интеграл вычилсляется верно. И теперь при фиксированном кол-во сечений, интеграл, считаемый по формуле Симпсона сходится к числу, а не уходит в бесконечность. |
||||
|
|||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
А что Вы сделали с solveBy_Simpson??? И почему n имеет тип double???
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
АлексейX86 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
И все же....
Не могу понять зачем там нужно было на stepX умножать. Вот например есть колбаса у меня. Я ее взвешиваю (m0). Затем я ее нарезаю перпендикулярно на 10 кусков (m1-m10). При нарезке часть колбасы останется на ноже, часть испарится, и т.д. Если я сложу веса всех частей (m1-m10), то я получу m0-погрешность. Вообщем, по такой идее я и писал первую версию программы. Может быть я не учитываю то, при бесконечно малом уменьшении размера ломтя (а соответственно и массы), будет большее кол-во разрезов, и более большая часть массы будет теряться. Это сообщение отредактировал(а) АлексейX86 - 31.8.2015, 17:45 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Совсем не странно. У Вас интегрируемая функция падает что по x, что по y, соответственно, прямоугольники, по которым Вы считаете площадь, будут покрывать все пространство под функцией, да ещё немного выступать - вычисленная площадь получиться больше реальной, да ещё по объему та же ситуация. Добавлено через 2 минуты и 35 секунд Интересно, а то что нужно умножать на h во внутреннем интеграле, Вам понятно? Объем слайса есть его площадь умноженная на толщину этого объема. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
АлексейX86 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.2.2013 Репутация: нет Всего: нет |
Все, понял.
Я что-то зациклился что толщина сплайса единица, и соответственно домножать не надо.... ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |