Решите BVP с двумя решениями

Этот пример использует bvp4c с двумя различными начальными предположениями, чтобы найти оба решения задачи BVP.

Рассмотрим дифференциальное уравнение

y+ey=0.

Это уравнение удовлетворяет граничным условиям

y(0)=y(1)=0.

Чтобы решить это уравнение в MATLAB, необходимо кодировать уравнение и граничные условия, затем сгенерировать подходящее начальное предположение для решения перед вызовом решателя для краевой задачи bvp4c. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.

Кодовое уравнение

Создайте функцию, чтобы кодировать уравнение. Эта функция должна иметь подпись dydx = bvpfun(x,y) или dydx = bvpfun(x,y,parameters), где:

  • x - независимая переменная.

  • y - решение (зависимая переменная).

  • parameters является вектором с неизвестными значениями параметров (необязательно).

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

y1=y2,

y2=-ey1.

Функция, кодирующая эти уравнения,

function dydx = bvpfun(x,y)
dydx = [y(2)
        -exp(y(1))];
end

Граничные условия кода

Для двухточечных условий граничного значения, подобных таковых находятся в этой задаче, функция граничных условий должна иметь сигнатуру res = bcfun(ya,yb) или res = bcfun(ya,yb,parameters), в зависимости от того, задействованы ли неизвестные параметры. ya и yb являются векторами-столбцами, которые решатель автоматически передает функции, и bcfun возвращает невязку в граничных условиях.

Для граничных условий y(0)=y(1)=0, а bcfun функция задает, что остаточное значение равно нулю на обоих контурах. Эти невязки значения принудительно применяются в первой и последней точках mesh, которую вы задаете bvpinit по вашему первоначальному предположению. Начальный mesh в этой задаче должна была x(1) = 0 и x(end) = 1.

function res = bcfun(ya,yb)
res = [ya(1)
       yb(1)];
end

Начальное предположение формы

Функции bvpinit чтобы сгенерировать начальное предположение решения. Mesh для 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')

Figure contains an axes. The axes with title BVP with Different Solutions That Depend on the Initial Guess contains 2 objects of type line. These objects represent 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
%-------------------------------------------

См. также

| |

Похожие темы