Решение краевой задачи - метод пятого порядка
интегрирует систему дифференциальных уравнений вида y ′ = f (x, y), заданную sol = bvp5c(odefun,bcfun,solinit)odefun, в соответствии с граничными условиями, описанными bcfun и начальное предположение о решении solinit. Используйте bvpinit функция для создания начального предположения solinit, которая также определяет точки, в которых граничные условия bcfun принудительно.
также использует настройки интеграции, определенные sol = bvp5c(odefun,bcfun,solinit,options)options, который является аргументом, созданным с помощью bvpset функция. Например, используйте AbsTol и RelTol для задания абсолютных и относительных допусков ошибок или FJacobian возможность предоставления аналитических частных производных odefun.
Решите BVP второго порядка в MATLAB ® с помощью функций. Для этого примера используйте уравнение второго порядка
y = 0.
Уравнение определяется на интервале ] в зависимости от граничных условий
= 0,
= 2.
Чтобы решить это уравнение в MATLAB, нужно записать функцию, которая представляет уравнение как систему уравнений первого порядка, функцию для граничных условий и функцию для начального предположения. Затем решатель BVP использует эти три входа для решения уравнения.
Кодовое уравнение
Напишите функцию, которая кодирует уравнение. Используйте подстановки y = y ′, чтобы переписать уравнение как систему уравнений первого порядка.
,
.
Соответствующая функция:
function dydx = bvpfcn(x,y) dydx = zeros(2,1); dydx = [y(2) -y(1)]; end
Примечание.Все функции включены в конце примера как локальные функции.
Граничные условия кода
Запишите функцию, которая кодирует граничные условия в виде )) = 0. В этой форме граничными условиями являются
= 0,
= 0.
Соответствующая функция:
function res = bcfcn(ya,yb) res = [ya(1) yb(1)-2]; end
Создать начальное предположение
Используйте bvpinit чтобы создать начальное предположение для решения уравнения. Поскольку уравнение относится y ′ y, разумное предположение состоит в том, что решение включает тригонометрические функции. Используйте сетку из пяти точек в интервале интегрирования. Первое и последнее значения в сетке - это то, где решатель применяет граничные условия.
Функция для начального предположения принимает в качестве входного значения и возвращает предположение для значений и . Функция:
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')
Локальные функции
Здесь перечислены локальные функции, которые 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 %--------------------------------
bvp4c и bvp5c Решающие устройстваРешите BVP с допуском грубой ошибки с помощью двух различных решателей и сравните результаты.
Рассмотрим ОДУ второго порядка
+2xy′+1x4y=0.
Уравнение определяется на интервале ] в зависимости от граничных условий
= 0,
(1).
Чтобы решить это уравнение в MATLAB ®, необходимо записать функцию, которая представляет уравнение как систему уравнений первого порядка, записать функцию для граничных условий, задать некоторые значения опций и создать начальное предположение. Затем решатель BVP использует эти четыре входа для решения уравнения.
Кодовое уравнение
С помощью подстановок y = y ′ можно переписать ОДУ как систему уравнений первого порядка
,
.
Соответствующая функция:
function dydx = bvpfcn(x,y) dydx = [y(2) -2*y(2)/x - y(1)/x^4]; end
Примечание.Все функции включены в конце примера как локальные функции.
Граничные условия кода
Функция граничного условия требует, чтобы граничные условия были в форме )) = 0. В этой форме граничными условиями являются
= 0,
) = 0.
Соответствующая функция:
function res = bcfcn(ya,yb) res = [ya(1) yb(1)-sin(1)]; end
Задать параметры
Использовать bvpset для включения отображения статистики решателя и указания допусков грубых ошибок, чтобы выделить разницу в управлении ошибками между решателями. Также для эффективности укажите аналитический якобиан
Соответствующей функцией, возвращающей значение якобиана, является
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 для создания начальной догадки решения. Задайте константную функцию в качестве начального предположения с начальной сеткой из 10 точек в интервале ].
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 с аналитическим решением для сравнения. Аналитическое решение:
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')

Сюжет подтверждает, что 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 - Функции для решенияРешаемые функции, определяемые как дескриптор функции, определяющий интегрированные функции. odefun и bcfun должен принимать одинаковое количество входных аргументов.
Закодировать odefun, использовать функциональную подпись dydx = odefun(x,y) для скаляра x и вектор столбца y. Возвращаемое значение dydt - вектор столбца типа данных single или double что соответствует f (x, y ).odefun должен принимать оба входных аргумента x и y, даже если один из аргументов не используется в функции.
Например, для решения − 3 используйте функцию:
function dydt = odefun(t,y) dydt = 5*y-3; end
Для системы уравнений выход odefun является вектором. Каждый элемент вектора является решением одного уравнения. Например, для решения
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
bcfun - Граничные условияГраничные условия, заданные как дескриптор функции, вычисляющий остаточную ошибку в граничных условиях. 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)];
endya(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
solinit - Первоначальное предположение о решенииНачальное предположение о решении, указанное как структура. Использовать bvpinit создать solinit.
В отличие от задач начального значения, задача граничного значения не может иметь решения, конечного числа решений или бесконечно большого количества решений. Важной частью процесса решения BVP является обеспечение предположения для требуемого решения. Качество этого предположения может быть критически важным для производительности решателя и даже для успешного вычисления. Некоторые рекомендации по созданию хорошего начального предположения см. в разделе Начальное угадывание решения.
Пример: sol = bvp5c(@odefun, @bcfun, solinit)
Типы данных: struct
options - Структура опционаСтруктура опции. Используйте bvpset для создания или изменения структуры опций.
Пример: options = bvpset('RelTol',1e-5,'Stats','on') указывает относительный допуск ошибки 1e-5 и включает отображение статистики решателя.
Типы данных: struct
sol - Структура решенияСтруктура решения. Вы можете получить доступ к полям в sol с точечным индексированием, например sol.field1. Решение (sol.x,sol.y) является непрерывным на интервале интегрирования, определенном в начальной сетке solinit.x и имеет непрерывную первую производную. Вы можете использовать sol с deval для оценки решения в других точках интервала.
Структура sol имеет эти поля.
| Область | Описание |
|---|---|
| Сетка, выбранная |
| Приближение к y (x) в точках сетки |
| Приближение к y ′ (x) в точках сетки |
| Окончательные значения неизвестных параметров, указанных в |
|
|
| Статистика вычислительных затрат, связанная с решением: количество точек ячеистой сети, остаточная ошибка и количество вызовов |
Для проблем с многоточечными граничными значениями граничные условия применяются в нескольких точках в интервале интегрирования.
bvp5c может решать задачи многоточечных граничных значений, где a = a0 < a1 < a2 < ... < an = b - граничные точки в интервале [a, b]. Точки a1, a2,..., a − 1 представляют интерфейсы, которые делят [a, b] на области.bvp5c перечисляет области слева направо (от a до b) с индексами, начинающимися с 1. В регионе k, [ak − 1, ak],bvp5c оценивает производную как
yp = odefun(x,y,k)
В функции граничных условий bcfun(yleft,yright), yleft(:,k) - решение на левой границе [ak − 1, ak]. Аналогично,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, формы
(0), y (b), p).
Интервал должен быть [0, b] с b > 0. Часто такие проблемы возникают при вычислении гладкого решения ОДУ, которые являются результатом дифференциальных уравнений в частных производных (ПДЭ) из-за цилиндрической или сферической симметрии. Для сингулярных задач задается матрица (константа). S как значение 'SingularTerm' вариант bvpset, и odefun вычисляет только f (x, y, p). Граничные условия и начальное предположение должны соответствовать необходимому условию для гладкости S· y (0) = 0.
Пример решения проблемы сингулярного граничного значения см. в разделе Решение BVP с сингулярным термином.
bvp5c - код конечных разностей, реализующий четырёхступенчатую формулу Лобатто Λ a [1]. Это формула коллокации, и полином коллокации обеспечивает C1-continuous решение, которое является пятым порядка точно равномерно в [a,b]. Формула реализуется как неявная формула Рунге-Кутты. Некоторые различия между bvp5c и bvp4c являются:
bvp5c решает алгебраические уравнения напрямую. bvp4c использует аналитическую конденсацию.
bvp4c непосредственно обрабатывает неизвестные параметры. bvp5c дополняет систему тривиальными дифференциальными уравнениями для неизвестных параметров.
[1] Шампин, Л.Ф. и Дж. Кьерзенка. «Решатель BVP, управляющий остаточными значениями и ошибками». Дж. Нумер. Анал. инд. эппл. мат. т. 3 (1-2), 2008, стр. 27-41.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.