Comments 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.
Могу рекомендовать к изучению книгу Н.Н. Калиткина “Численные методы”. Думаю, что вы ее легко отыщете
C++ и Численные Методы: Приближенное интегрование по Ньютону-Котесу