Двухточечная граница с одеинтом

Я пытаюсь решить проблему двухточечной границы с помощью 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 или другой научной библиотеки?


person Eugene B    schedule 19.07.2013    source источник


Ответы (2)


В этом случае вам нужен метод съемки. odeint не имеет такого метода, он решил проблему начального значения (IVP), которая является вашим первым случаем. Я думаю, что в числовых рецептах этот метод объясняется, и вы можете использовать Boost.Odeint для выполнения временного шага.

person headmyshoulder    schedule 19.07.2013
comment
Мне тоже так казалось, но я думал, что у odeint может быть - это просто моя проблема, что я не могу его найти. В любом случае, спасибо! - person Eugene B; 19.07.2013

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

Другой подход заключается в использовании 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