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

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

3

Решение

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

3

Другие решения

Альтернативный и более эффективный метод решения этого типа проблемы — метод конечных разностей или метод конечных элементов. Для конечных различий вы можете проверить числовые рецепты. Для конечных элементов я рекомендую библиотеку 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 ++

0

По вопросам рекламы [email protected]