bvp5c

Решите контур значения задачу - метод пятого порядка

Описание

пример

sol = bvp5c(odefun,bcfun,solinit) интегрирует систему дифференциальных уравнений вида y ′ = f (x, y), заданную как odefun, с учетом граничных условий, описанных bcfun и начальное решение угадает solinit. Используйте bvpinit функция для создания начального предположения solinit, который также определяет точки, в которых граничные условия в bcfun применяются.

пример

sol = bvp5c(odefun,bcfun,solinit,options) также использует настройки интегрирования, заданные как options, который является аргументом, созданным с помощью bvpset функция. Для примера используйте AbsTol и RelTol опции для задания абсолютных и относительная погрешность допусков или FJacobian опция предоставления аналитических частных производных odefun.

Примеры

свернуть все

Решить BVP второго порядка в MATLAB ® используя функции. В данном примере используйте уравнение второго порядка

y+y=0.

Уравнение определяется интервалом [0,π/2] при условии соблюдения граничных условий

y(0)=0,

y(π/2)=2.

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

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

Напишите функцию, которая кодирует уравнение. Используйте замены y1=y и y2=y переписать уравнение как систему уравнений первого порядка.

y1=y2,

y2=-y1.

Соответствующая функция является

function dydx = bvpfcn(x,y)
dydx = zeros(2,1);
dydx = [y(2)
       -y(1)];
end

Примечание: Все функции включены в конец примера как локальные функции.

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

Написание функции, которая кодирует граничные условия в форме g(y(a),y(b))=0. В этой форме граничные условия

y(0)=0,

y(π/2)-2=0.

Соответствующая функция является

function res = bcfcn(ya,yb)
res = [ya(1)
       yb(1)-2];
end

Создайте начальное предположение

Используйте bvpinit функция для создания начального предположения для решения уравнения. Поскольку уравнение относится y кому yразумно предположить, что решение включает тригонометрические функции. Используйте mesh пяти точек в интервале интегрирования. Первое и последнее значения в mesh находятся там, где решатель применяет граничные условия.

Функция для начального предположения принимает x в качестве входов и возвращает предположение для значения y1 и y2. Функция является

function g = guess(x)
g = [sin(x)
     cos(x)];
end
xmesh = linspace(0,pi/2,5);
solinit = bvpinit(xmesh, @guess);

Решение уравнения

Использование bvp5c с производной функцией, функцией граничных условий и начальным предположением, чтобы решить задачу.

sol = bvp5c(@bvpfcn, @bcfcn, solinit);

Решение для построения графика

plot(sol.x, sol.y, '-o')

Figure contains an axes. The axes contains 2 objects of type line.

Локальные функции

Здесь перечислены локальные функции, которые bvp5c использует, чтобы решить уравнение.

function dydx = bvpfcn(x,y) % equation to solve
dydx = zeros(2,1);
dydx = [y(2)
       -y(1)];
end
%--------------------------------
function res = bcfcn(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)-2];
end
%--------------------------------
function g = guess(x) % initial guess for y and y'
g = [sin(x)
     cos(x)];
end
%--------------------------------

Решите BVP с допуском на грубую ошибку с двумя другими решателями и сравните результаты.

Рассмотрите ОДУ второго порядка

y+2xy+1x4y=0.

Уравнение определяется интервалом [13π,1] при условии соблюдения граничных условий

y(13π)=0,

y(1)=sin(1).

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

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

С заменами y1=y и y2=y, можно переписать ОДУ как систему уравнений первого порядка

y1=y2,

y2=-2xy2-1x4y1.

Соответствующая функция является

function dydx = bvpfcn(x,y)
dydx = [y(2)
       -2*y(2)/x - y(1)/x^4];
end

Примечание: Все функции включены в конец примера как локальные функции.

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

Функция граничного условия требует, чтобы граничные условия находились в форме g(y(a),y(b))=0. В этой форме граничные условия

y(13π)=0,

y(1)-sin(1)=0.

Соответствующая функция является

function res = bcfcn(ya,yb)
res = [ya(1)
       yb(1)-sin(1)];
end

Задать опции

Использование bvpset чтобы включить отображение статистики решателя и задать допуски, чтобы выделить различие в управлении ошибками между решателями. Кроме того, для эффективности укажите аналитический якобиан

J=fiy=[f1y1f1y2f2y1f2y2]=[01-1x4-2x].

Соответствующая функция, которая возвращает значение якобиана,

function dfdy = jac(x,y)
dfdy = [0      1
       -1/x^4 -2/x];
end
opts = bvpset('FJacobian',@jac,'RelTol',0.1,'AbsTol',0.1,'Stats','on');

Создайте начальное предположение

Использование bvpinit чтобы создать начальное предположение о решении. Задайте постоянную функцию как начальное предположение с начальным mesh в 10 точек в интервале [1/3π,1].

xmesh = linspace(1/(3*pi), 1, 10);
solinit = bvpinit(xmesh, [1; 1]);

Решение уравнения

Решить уравнение обоими bvp4c и bvp5c.

sol4c = bvp4c(@bvpfcn, @bcfcn, solinit, opts);
The solution was obtained on a mesh of 9 points.
The maximum residual is  9.794e-02. 
There were 157 calls to the ODE function. 
There were 28 calls to the BC function. 
sol5c = bvp5c(@bvpfcn, @bcfcn, solinit, opts);
The solution was obtained on a mesh of 11 points.
The maximum error is  6.742e-02. 
There were 244 calls to the ODE function. 
There were 29 calls to the BC function. 

Графическое изображение результатов

Постройте график результатов двух вычислений для y1 с аналитическим решением для сравнения. Аналитическое решение

y1=sin(1x),

y2=-1x2cos(1x).

xplot = linspace(1/(3*pi),1,200);
yplot = [sin(1./xplot); -cos(1./xplot)./xplot.^2];

plot(xplot,yplot(1,:),'k',sol4c.x,sol4c.y(1,:),'r*',sol5c.x,sol5c.y(1,:),'bo')
title('Comparison of BVP Solvers with Crude Error Tolerance')
legend('True','BVP4C','BVP5C')
xlabel('x')
ylabel('solution y')

Figure contains an axes. The axes with title Comparison of BVP Solvers with Crude Error Tolerance contains 3 objects of type line. These objects represent True, BVP4C, BVP5C.

График подтверждает, что bvp5c непосредственно управляет истинной ошибкой в вычислении, в то время как bvp4c управляет им только косвенно. При более строгих допусках ошибок это различие между решателями не так очевидна.

Локальные функции

Здесь перечислены локальные функции, которые решатели BVP используют для решения задачи.

function dydx = bvpfcn(x,y) % equation to solve
dydx = [y(2)
       -2*y(2)/x - y(1)/x^4];
end
%---------------------------------
function res = bcfcn(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)-sin(1)];
end
%---------------------------------
function dfdy = jac(x,y) % analytical jacobian for f
dfdy = [0      1
       -1/x^4 -2/x];
end
%---------------------------------

Входные параметры

свернуть все

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

К коду odefun, используйте функциональную сигнатуру dydx = odefun(x,y) для скалярного x и вектор-столбец y. Значение возврата dydt является вектор-столбец типа данных single или double что соответствует f (x, y). odefun необходимо принять оба входных параметров x и y, даже если один из аргументов не используется в функции.

Для примера, чтобы решить y'=5y3, используйте функцию:

function dydt = odefun(t,y)
dydt = 5*y-3;
end

Для системы уравнений выход odefun является вектором. Каждый элемент в векторе является решением одного уравнения. Для примера, чтобы решить

y'1=y1+2y2y'2=3y1+2y2

используйте функцию:

function dydt = odefun(t,y)
dydt = zeros(2,1);
dydt(1) = y(1)+2*y(2);
dydt(2) = 3*y(1)+2*y(2);
end

bvp5c также может решить задачи с особенностями в решении или многоточечных граничных условиях.

Пример: sol = bvp5c(@odefun, @bcfun, solinit)

Неизвестные параметры

Если решаемый BVP включает неизвестные параметры, можно вместо этого использовать функциональную сигнатуру dydx = odefun(x,y,p), где p является вектором значений параметров. Когда вы используете эту функциональную сигнатуру, решатель BVP вычисляет значения неизвестных параметров, начиная с начального предположения для значений параметров, представленных в solinit.

Типы данных: function_handle

Граничные условия, заданные как указатель на функцию, который вычисляет остаточную ошибку в граничных условиях. odefun и bcfun необходимо принять одинаковое количество входных параметров.

К коду bcfun, используйте функциональную сигнатуру res = bcfun(ya,yb) для векторов-столбцов ya и yb. Значение возврата res является вектор-столбец типа данных single или double что соответствует остаточному значению граничных условий в граничных точках.

Например, если y(a) = 1 и y(b) = 0, то функция граничного условия

function res = bcfun(ya,yb)
res = [ya(1)-1
       yb(1)];
end
С y(a) = 1 года остаточное значение ya(1)-1 должен быть 0 в точке x = a. Точно так же, с y(b) = 0 года, остаточное значение yb(1) должен быть 0 в точке x = b.

Граничные точки x = a и x = b, где применяются граничные условия, заданы в исходной предположительной структуре solinit. Для двухточечных граничных задач значения, a = solinit.x(1) и b = solinit.x(end).

Пример: sol = bvp5c(@odefun, @bcfun, solinit)

Неизвестные параметры

Если решаемый BVP включает неизвестные параметры, можно вместо этого использовать функциональную сигнатуру res = bcfun(ya,yb,p), где p является вектором значений параметров. Когда вы используете эту функциональную сигнатуру, решатель BVP вычисляет значения неизвестных параметров, начиная с начального предположения для значений параметров, представленных в solinit.

Типы данных: function_handle

Начальное предположение решения, заданное как структура. Использовать bvpinit для создания solinit.

В отличие от задач начального значения, краевая задача может не иметь решения, конечного числа решений или бесконечно многих решений. Важной частью процесса решения BVP является предоставление предположения для необходимого решения. Качество этой догадки может быть критическим для эффективности решателя и даже для успешных расчетов. Для некоторых рекомендаций по созданию хорошего начального предположения смотрите Initial Guess of Solution.

Пример: sol = bvp5c(@odefun, @bcfun, solinit)

Типы данных: struct

Структура опций. Используйте bvpset функция для создания или изменения структуры опций.

Пример: options = bvpset('RelTol',1e-5,'Stats','on') задает относительную погрешность допуск 1e-5 и включает отображение статистики решателя.

Типы данных: struct

Выходные аргументы

свернуть все

Структура решения. Вы можете получить доступ к полям в sol с индексацией через точку, например sol.field1. Решение (sol.x, sol.y) непрерывно на интервале интегрирования, заданном в исходном mesh solinit.x и имеет непрерывную первую производную там. Можно использовать sol с deval функция для вычисления решения в других точках интервала.

Структура sol имеет эти поля.

ОбластьОписание

x

Mesh, выбранная по bvp5c. Этот mesh обычно содержит другие точки, чем исходный mesh solinit.x.

y

Приближение к y (x) в точках сетки sol.x.

yp

Приближение к y(x) в точках сетки sol.x.

parameters

Окончательные значения неизвестных параметров, заданные в solinit.parameters.

solver

'bvp5c'

stats

Вычислительная статистика затрат, связанная с решением: количество точек ячеек, остаточная ошибка и количество вызовов odefun и bcfun.

Подробнее о

свернуть все

Многоточечные краевые задачи

Для многоточечных краевых значений задач граничные условия применяются в нескольких точках интервала интегрирования.

bvp5c может решить многоточечные краевые задачи, где a = <reservedrangesplaceholder14> 0          <<reservedrangesplaceholder13> 1 <<reservedrangesplaceholder12> 2 <... <<reservedrangesplaceholder11> <reservedrangesplaceholder10> = b являются граничными точками в интервале [a, b]. Точки a 1, a 2,... ,a n − 1 представляют интерфейсы, которые делятся [a, b] на области. bvp5c перечисляет области слева направо (от a до b) с индексами, начинающимися от 1. В области k, [<reservedrangesplaceholder4> <reservedrangesplaceholder3> −1, <reservedrangesplaceholder2> <reservedrangesplaceholder1>], bvp5c оценивает производную как

yp = odefun(x,y,k) 

В функции граничных условий bcfun(yleft,yright), yleft(:,k) решение в левом контуре [<reservedrangesplaceholder4> <reservedrangesplaceholder3> −1, <reservedrangesplaceholder2> <reservedrangesplaceholder1>]. Точно так же yright(:,k) - решение на правом контуре области k. В частности, yleft(:,1) = y(a) и yright(:,end) = y(b).

Когда вы создаете начальное предположение с bvpinit, используйте двойные значения в xinit для каждой точки интерфейса. Смотрите страницу с описанием для bvpinit для получения дополнительной информации.

Если yinit является функцией, bvpinit вызывает y = yinit(x,k) чтобы получить начальное предположение для решения в x в области k. В структуре решения sol возвращается по bpv4c, sol.x имеет двойные значения для каждой точки интерфейса. Соответствующие столбцы sol.y содержат левое и правое решения в интерфейсе, соответственно.

Смотрите Решение BVP с несколькими граничными условиями для примера, который решает задачу граничного значения с тремя точками.

Сингулярные краевые задачи

bvp5c решает класс сингулярных краевых значений задач, включая задачи с неизвестными параметрами p, формы

y'=Syx+f(x,y,p),0=bc(y(0),y(b),p).

Интервал должен быть [0, b] с b > 0. Часто такие проблемы возникают при вычислении плавного решения ОДУ, которые являются результатом дифференциальных уравнений с частными производными (PDE) из-за цилиндрической или сферической симметрии. Для сингулярных задач задаете (постоянную) матрицу S как значение 'SingularTerm' опция bvpset, и odefun оценивает только f (x, y, p). Граничные условия и начальное предположение должны соответствовать необходимому условию для плавности S · y (0) = 0.

Смотрите Решение BVP с Сингулярным Термином для примера, который решает задачу сингулярного граничного значения.

Алгоритмы

bvp5c является конечным разностным кодом, который реализует четырехэтапную формулу Лобатто IIIa [1]. Это формула коллокации, и полином коллокации обеспечивает C1- непрерывное решение, которое равномерно в пятом порядке [a,b]. Формула реализована как неявная формула Рунге-Кутты. Некоторые различия между bvp5c и bvp4c являются:

  • bvp5c решает алгебраические уравнения непосредственно. bvp4c использует аналитическую конденсацию.

  • bvp4c непосредственно обрабатывает неизвестные параметры. bvp5c увеличивает систему тривиальными дифференциальными уравнениями для неизвестных параметров.

Ссылки

[1] Шемпине, Л.Ф., и Я. Кирженка. «Решатель BVP, который управляет невязкой и ошибкой». Дж. Нумер. Anal. Ind. App. Math. Vol. 3 (1-2), 2008, pp. 27-41.

Введенный в R2006b