Решите 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

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

Для условий граничного значения 2D точки как те в этой проблеме функция граничных условий должна иметь подпись 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 object. The axes object 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
%-------------------------------------------

Смотрите также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте