Альтернативным и более эффективным методом решения такого типа задач является метод конечных разностей или метод конечных элементов. Для конечных разностей вы можете проверить числовые рецепты. Для конечных элементов рекомендую библиотеку диалии.
Другой подход заключается в использовании b-сплайнов: если вы знаете начальную x0 и конечную xfinal точки интегрирования, то вы можете разложить решение y(x) на основе b-сплайна, определенного по (x0,xfinal), т.е.
y(x)= \sum_{i=1}^n A_i*B_i(x),
где A_i — определяемые постоянные коэффициенты, а B_i(x) — базис b-сплайна (четко определенные полиномиальные функции, которые можно дифференцировать численно). Для научных приложений вы можете найти реализацию b-сплайнов в GSL.
С этой заменой краевая задача сводится к линейной задаче, поскольку (использую суммирование Эйнштейна для повторяющихся индексов):
A_i*[ B_i''(x) + a*B_i'(x) + b*B_i(x)] + c =0
Вы можете выбрать набор точек x и создать линейную систему из приведенного выше уравнения. Вы можете найти информацию об этом типе метода в следующем обзорном документе «Применение B-сплайнов в атомной и молекулярной физике» — Х. Бахау, Э. Кормье, П. Деклева, Дж. Э. Хансен и Ф. Мартин.
http://iopscience.iop.org/0034-4885/64/12/205/
Я не знаю ни одной библиотеки, решающей непосредственно эту задачу, но есть несколько библиотек для B-сплайнов (для ваших нужд рекомендую GSL), которые позволят вам сформировать линейную систему. См. этот вопрос о стеке: Spline, B-Spline и библиотека NURBS C++
person
Foivos
schedule
05.02.2015