Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 04.03.2019, 09:55   #11 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Хорошо.
Прежде всего — НИКАКИХ ОШИБОК В КОДЕ НЕТ! И идёт Ваш препод, извините, лесом...
Теперь давайте разбираться.
Как я писал выше, формула Симпсона есть
(t/3)*(Y0 + 4*Y1 + 2*Y2 + 4*Y3 + ... + Y2N)
Давайте для простоты предположим, что интервал (a, b) мы разбили на шесть отрезков (повторяю, число отрезков должно быть ЧЁТНЫМ). Таким образом, по оси X мы имеем 7 точек: X0, X1, X2, X3, X4, X5 и X6. Соответственно, по оси Y имеем 7 значений: Y0, Y1, Y2, Y3, Y4, Y5 и Y6, равных f(X0), f(X1), f(X2), f(X3), f(X4), f(X5) и f(X6), причем X0=a, Y0=f(X0)=f(a) и X6=b, Y6=f(X6)=f(b), где f — подынтегральная функция. Величина t есть (b-a)/6. Теперь давайте искать сумму.
1. Определяем вклад концевых точек. Он есть
t/3*(Y0+Y6)=t/3*(f(a)+f(b)).
2. Добавляем вклад от точек X1, X3 и X5. Соответствующие им значения Y1, Y3 и Y5 идут с коэффициентом 4. Поэтому добавляем к сумме величину
t/3*(4Y1+4Y3+4Y5)=t/3*(4f(X1)+4f(X3)+4f(X5))
3. И, наконец, добавляем вклад от точек X2 и X4. Соответствующие им значения Y2 и Y4 идут с коэффициентом 2. Поэтому добавляем к сумме величину
t/3*(2Y2+2Y4)=t/3*(2f(X2)+2f(X4)).
Всё!
Теперь построим алгоритм перебора индексов при нахождении указанных сумм. Заметим, что
X1=X0+t=a+t
X2=X0+2t=a+2t
X3=X0+3t=a+3t
X4=X0+4t=a+4t
X5=X0+5t=a+5t
X6=X0+6t=a+6t=b
Таким образом, для X1, X3 и X5 имеем
X(2i-1)=a+t*(2i-1), i меняется от 1 до 3 (слева в скобках — индекс).
Для X2 и X4 имеем
X(2i-2)=a+t*(2i-2), i меняется от 2 до 3.
Вот, собственно, всё это и проделано в строках от 1 до 7 и от 11 до 17. И, ещё раз повторяю, НИКАКИХ ОШИБОК ТАМ НЕТ!!!
Дальше там организован цикл мельчения разбивки до достижения требуемой точности.
ВСЁ!

P.S. Возможно, Ваш высокоучёный препод не заметил, что в строке 6 цикл берется в пределах от 2 до N. Можно, конечно, взять пределы от 1 до N-1, тогда "-2" в строке 7 нужно убрать. Но это — исключительно дело вкуса, на результат не повлияет. Советую Вам ткнуть этого ученого мужа носом в шестую строку, чтобы осознал значения поставленных пределов и не вякал про "ошибки". Хех, да да...
Vladimir_S вне форума   Ответить с цитированием

Старый 04.03.2019, 09:55
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Суть содержания этой темы схожа с этими темами

Си, функция
Turbo Pascal, метод Симпсона
Функция DEP?
Функция

Старый 04.03.2019, 23:37   #12 (permalink)
Alessandro4
Member
 
Регистрация: 27.02.2019
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Благодарю! Вроде потихоньку вникаю)
Еще вопросики.. В прошлом разъяснении вы сказали, что h=(b-a)/(2N), а в коде у вас, да и в моей методичке h уже известен - 0,2, насчет t, должно быть это коэффициент перед "скобкой" в формуле Симпсона, раз он равен (b-a)/6, а в самом коде вы присваиваете ему (p-a)/(2*N), почему? И я так понял переменную b вы не ввели и почему вы не учли кол-во частей разбивки - 36?
Alessandro4 вне форума   Ответить с цитированием
Старый 05.03.2019, 08:43   #13 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Отвечаю в порядке поступления.
Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
В прошлом разъяснении вы сказали, что h=(b-a)/(2N), а в коде у вас, да и в моей методичке h уже известен - 0,2
Так, не путаем, как говорится, "божий дар с яичницей". В задаче речь идёт о вычислении интеграла С ПЕРЕМЕННЫМ ВЕРХНИМ ПРЕДЕЛОМ, т.е. о построении зависимости интеграла от х — верхнего предела. Так вот, h — это ШАГ ИЗМЕНЕНИЯ ВЕРХНЕГО ПРЕДЕЛА, к разбиению интервала при численном интегрировании для каждого значения х эта величина отношения НЕ ИМЕЕТ. Шаг разбиения интервала от а до х у меня обозначен буквой t. Действительно, обычно эта величина в справочниках и пособиях обозначается, как h, отсюда некоторая путаница. Извините.
Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
насчет t, должно быть это коэффициент перед "скобкой" в формуле Симпсона, раз он равен (b-a)/6, а в самом коде вы присваиваете ему (p-a)/(2*N), почему?
(b-a)/6 — это только в поясняющем примере, не более того. В задаче же речь идёт о вычислении интеграла с ПЕРЕМЕННЫМ верхним пределом. Этот переменный предел является аргументом функции Simpson (обозначен p). При обращении к функции на его место подставляется фактический параметр х.
Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
И я так понял переменную b вы не ввели
Не ввёл. За полной ненадобностью.
Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
и почему вы не учли кол-во частей разбивки - 36?
Я уже подробно отвечал на этот вопрос, см. #9, пункт 2. За идиотизм авторов методички, извините, не отвечаю.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 16:08.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.