Я пытаюсь решить двухточечную краевую задачу с помощью odeint. Мое уравнение имеет вид
y'' + a*y' + b*y + c = 0
Это довольно тривиально, когда у меня есть граничные условия y(x_1) = y_1 , y'(x_2) = y_2
, но когда граничные условия y(x_1) = y_1 , y(x_2) = y_2
Я потерян. Кто-нибудь знает способ решения таких проблем с помощью odeint или другой научной библиотеки?
В этом случае вам нужен метод стрельбы. У odeint нет такого метода, он решил проблему начальных значений (IVP), которая является вашим первым случаем. Я думаю, что в Числовых рецептах этот метод объяснен, и вы можете использовать Boost.Odeint, чтобы сделать шаг времени.
Альтернативный и более эффективный метод решения этого типа проблемы — метод конечных разностей или метод конечных элементов. Для конечных различий вы можете проверить числовые рецепты. Для конечных элементов я рекомендую библиотеку dealii.
Другой подход заключается в использовании 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-сплайнов в атомной и молекулярной физике» — H Bachau, E Cormier, P Decleva, J E Hansen и F Martín
http://iopscience.iop.org/0034-4885/64/12/205/
Я не знаю ни одной библиотеки, которая бы решала эту проблему напрямую, но есть несколько библиотек для B-сплайнов (я рекомендую GSL для ваших нужд), которые позволят вам сформировать линейную систему. Посмотрите этот вопрос stackoverflow:
Библиотека Spline, B-Spline и NURBS C ++