Как стать автором
Обновить

Комментарии 12

Девчонки и мальчишки, а также их родители! Пожалуйста, помните, что в реальной жизни std::function надо передавать по значению, векторы — по ссылке, а для организации двумерных массивов есть более эффективные средства, чем вектор векторов.

Если вы говорите про более эффективные средства, то хотя бы их перечисляйте. А пока это выглядит как попытка поумничать.

Вам в реальности не нужно будет в рантайме менять длины некоторых строк/столбцов. Самое простое, но намного более эффективное решение это std::array из std::array. Никаких лишних аллокаций, всё в памяти одним блоком.

Ну а динамических многомерных массивов в стандартной библиотеке C++, к сожалению, до сих пор нет.

Мне очень сложно представить ситуацию, когда они бы понадобились на практике. А если и понадобятся в узкоспецифическом проекте, то их не очень сложно реализовать самому.

Изменять в рантайме размеры может и не нужно, но выделять, к примеру, матрицу размера, определённого в compile time, выглядит не всегда разумно. Вообще, как мне кажется, не нужно делать преждевременные оптимизации в ущерб читаемости кода, так как может оказаться, что проседания производительности не в лишних аллокациях. Да не спорю, круто писать сразу оптимальный во всех смыслах код, но кажется, что это может оказаться сильно дороже, чем хотелось бы.

Дать исчерпывающее перечисление всё равно не получится. Это может быть простой одномерный вектор вкупе с ручным вычислением эффективного индекса, std::array, самописный класс, обёртка над стандартным контейнером, что-то из контейнеров Boost и многое другое. И выбор зависит от немалого количества факторов. Применительно к данной статье мог бы подойти «голый» одномерный вектор или самописная обёртка, хотя первое несколько усложнит код по сравнению с «идеальным» двумерным массивом (вектор векторов в этом смысле тоже не подарочек), а второе потребует как минимум привести интерфейс и пояснения.

Когда речь заходит об оптимизации вычислений, то передавать вообще надо не std::function, а шаблонный функтор. Ну и алгоритмические моменты: нет никакого смысла вычислять значение функции в одной и той же точке дважды.

По алгоритмическим моментам поддержу. И повторные вычисления желательно сокращать, и возведение в квадрат и четвёртую степень лучше делать через умножение, а не дорогостоящий pow.
А вот накладные расходы на вызов std::function будут заметны на общем фоне только для совсем уж простых вычислений. Стоит ли жертвовать ради этого выразительностью и универсальностью, которые даёт function? Зависит от обстоятельств, но в учебном проекте вряд ли стоит сражаться за считанные такты ценой снижения ясности кода.

Графики чем строили?

Что-то все больше таких статей появляется. И дело даже не в том, каково качество реализации, сколько в том, что не раскрывается тема, обозначенная в заголовке.

Говоря о формулах Ньютона-Котеса, либо же, как их еще называют, методы Ньютона-Котеса, необходимо понимать, что это семейство методов подразумевает “аппроксимацию подинтегральной функции на выбранных промежутках многочленами”. Вот только автор как-то опускает аспект о многочленах (Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Глава 3, параграф 3.)

Во всех методах (которые, бесспорно, являются методами Ньютона-Котеса) опущен принципиальный для численных методов вопрос — оценка погрешности вычислений.

Здесь же можно упомянуть много, с точки зрения вычислительных методов, неточностей, которые, тем не менее, являются существенными для изложения такого рода методов.
В качестве примера:
“Точность приближения зависит от числа N отрезков, на которые разбивается промежуток интегрирования. Таким образом, длина промежутка: dx = (b-a)/N” (не понял, как можно вставить в коммент верстку LaTeX, простите).
Возникают вопросы о:
— «промежуток интегрирования»
— «длина промежутка»
— «отрезок интегрирования» (упомянуто немного выше)
и как связаны между собой эти понятия.

Далее. В разделе о методе Симпсона излагается следующее: “Метод Симпсона заключается в интегрировании интерполяционного многочлена второй степени функции f(x) с узлами интерполяции a, b и m = (a+b)/2 — параболы p(x).”
Узлы интерполяции это a, b и m = (a + b) / 2?

“Площадь параболы может быть найдена суммированием площадей 6 прямоугольников равной ширины. Высота первого из них должна быть равна f(a), с третьего по пятый — f(m), шестого — f(m)”
А какие это прямоугольники? Где они обозначены на вашем рисунке?
Формула, которую вы используете, “слегка” неправильна. Полагаю, что вы взяли формулу из этой статьи ttps://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A1%D0%B8%D0%BC%D0%BF%D1%81%D0%BE%D0%BD%D0%B0 но не разобрались до конца.

О применении метода Ромберга здесь… Хм…
В качестве примера — “а каждое решение второго столбца R (n, 1)”. Какие столбцы? Вы это откуда-то скопировали?
На этом хватит примеров.
Общее впечатление от этой статьи — очень поверхностно, местами нелогично. Как пример на эту же тему могу привести следующий пост habr.com/ru/post/420867.

Могу рекомендовать к изучению книгу Н.Н. Калиткина “Численные методы”. Думаю, что вы ее легко отыщете

У Вас в 4 формуле написано x[i]-x[i+1]. Это точно законно?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории