В этом примере используется bvp4c с двумя различными исходными догадками для поиска обоих решений проблемы BVP.
Рассмотрим дифференциальное уравнение
ey = 0.
Это уравнение подчиняется граничным условиям
1) = 0.
Чтобы решить это уравнение в MATLAB, необходимо кодировать уравнение и граничные условия, затем создать подходящее начальное предположение для решения перед вызовом решателя задач граничных значений. bvp4c. Требуемые функции можно либо включить в качестве локальных функций в конце файла (как здесь сделано), либо сохранить их как отдельные именованные файлы в каталоге по пути MATLAB.
Создайте функцию для кодирования уравнения. Эта функция должна иметь подпись dydx = bvpfun(x,y) или dydx = bvpfun(x,y,parameters), где:
x является независимой переменной.
y - решение (зависимая переменная).
parameters является вектором неизвестных значений параметров (необязательно).
Эти входные данные автоматически передаются функции решателем, но имена переменных определяют способ кодирования уравнений. В этом случае можно переписать уравнение второго порядка как систему уравнений первого порядка
,
.
Функция, кодирующая эти уравнения,
function dydx = bvpfun(x,y) dydx = [y(2) -exp(y(1))]; end
Для двухточечных граничных условий, таких как те, что в этой задаче, функция граничных условий должна иметь сигнатуру res = bcfun(ya,yb) или res = bcfun(ya,yb,parameters)в зависимости от того, используются ли неизвестные параметры. ya и yb - векторы столбцов, которые решатель автоматически передает функции, и bcfun возвращает остаток в граничных условиях.
Для граничных условий 1) = 0bcfun функция указывает, что остаточное значение равно нулю на обеих границах. Эти остаточные значения применяются в первой и последней точках сетки, для которой задано значение bvpinit в вашем первоначальном предположении. Начальная сетка в этой проблеме должна иметь x(1) = 0 и x(end) = 1.
function res = bcfun(ya,yb) res = [ya(1) yb(1)]; end
Звонить bvpinit для создания начальной догадки решения. Сетка для x не нужно иметь много очков, но первая точка должна быть 0. Тогда последняя точка должна быть 1, чтобы граничные условия были правильно заданы. Использовать начальное предположение для y где первый компонент является слегка положительным, а второй компонент равен нулю.
xmesh = linspace(0,1,5); solinit = bvpinit(xmesh, [0.1 0]);
Решение BVP с помощью bvp4c решатель.
sol1 = bvp4c(@bvpfun, @bcfun, solinit);
Решите BVP второй раз, используя другое начальное предположение для решения.
solinit = bvpinit(xmesh, [3 0]); sol2 = bvp4c(@bvpfun, @bcfun, solinit);
Постройте график решений, которые bvp4c вычисляется для различных начальных условий. Оба решения удовлетворяют указанным граничным условиям, но имеют разное поведение между ними. Поскольку решение не всегда является уникальным, различные варианты поведения показывают важность предоставления хорошего первоначального предположения для решения.
plot(sol1.x,sol1.y(1,:),'-o',sol2.x,sol2.y(1,:),'-o') title('BVP with Different Solutions That Depend on the Initial Guess') xlabel('x') ylabel('y') legend('Solution 1','Solution 2')

Здесь перечислены локальные вспомогательные функции, которые решатель BVP bvp4c вызывает для вычисления решения. Кроме того, эти функции можно сохранить в виде собственных файлов в каталоге по пути MATLAB.
function dydx = bvpfun(x,y) % equation being solved dydx = [y(2) -exp(y(1))]; end %------------------------------------------- function res = bcfun(ya,yb) % boundary conditions res = [ya(1) yb(1)]; end %-------------------------------------------