Решите краевую задачу — метод пятого порядка
sol = bvp5c(odefun,bcfun,solinit)
sol = bvp5c(odefun,bcfun,solinit,options)
интегрирует систему дифференциальных уравнений формы 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® с помощью функций. В данном примере используйте уравнение второго порядка
.
Уравнение определено на интервале подвергните граничным условиям
,
.
Чтобы решить это уравнение в MATLAB, необходимо записать функцию, которая представляет уравнение как систему уравнений первого порядка, функции для граничных условий и функции для исходного предположения. Затем решатель BVP использует эти три входных параметров, чтобы решить уравнение.
Уравнение кода
Запишите функцию, это кодирует уравнение. Используйте замены и переписать уравнение как систему уравнений первого порядка.
,
.
Соответствующая функция
function dydx = bvpfcn(x,y) dydx = zeros(2,1); dydx = [y(2) -y(1)]; end
Примечание: Все функции включены в конце примера как локальные функции.
Граничные условия кода
Запишите функцию, которая кодирует граничные условия в форме . В этой форме граничные условия
,
.
Соответствующая функция
function res = bcfcn(ya,yb) res = [ya(1) yb(1)-2]; end
Создайте исходное предположение
Используйте функцию bvpinit
, чтобы создать исходное предположение для решения уравнения. Поскольку уравнение имеет отношение к , разумное предположение - то, что решение включает тригонометрические функции. Используйте сетку пяти точек в интервале интегрирования. Первые и последние значения в mesh - то, где решатель применяет граничные условия.
Функция для исходного предположения принимает как вход и возвращает предположение для значения и . Функция
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')
Localfunctions
Перечисленный здесь локальные функции что использование 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 %--------------------------------
bvp5c
и bvp4c
Решите BVP в допуске грубой ошибки с двумя другими решателями и сравните результаты.
Рассмотрите ОДУ второго порядка
.
Уравнение определено на интервале подвергните граничным условиям
,
.
Чтобы решить это уравнение в MATLAB®, необходимо записать функцию, которая представляет уравнение как систему уравнений первого порядка, запишите функцию для граничных условий, установите некоторые значения опции и создайте исходное предположение. Затем решатель BVP использует эти четыре входных параметров, чтобы решить уравнение.
Уравнение кода
С заменами и , можно переписать ОДУ как систему уравнений первого порядка
,
.
Соответствующая функция
function dydx = bvpfcn(x,y) dydx = [y(2) -2*y(2)/x - y(1)/x^4]; end
Примечание: Все функции включены в конце примера как локальные функции.
Граничные условия кода
Функция граничного условия требует, чтобы граничные условия были в форме . В этой форме граничные условия
,
.
Соответствующая функция
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.
Постройте результаты
Постройте результаты этих двух вычислений для с аналитическим решением для сравнения. Аналитическое решение
,
.
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
управляет им только косвенно. В более строгих ошибочных допусках это различие между решателями не так очевидно.
Localfunctions
Перечисленный здесь локальные функции что использование решателей 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
, даже если один из аргументов не используется в функции.
Например, чтобы решить , используйте функцию:
function dydt = odefun(t,y) dydt = 5*y-3; end
Для системы уравнений вывод odefun
является вектором. Каждый элемент в векторе является решением одного уравнения. Например, чтобы решить
используйте функцию:
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)]; end
ya(1)-1
должен быть 0
в точке x = a. Точно так же начиная с y(b) = 0, остаточным значением yb(1)
должен быть 0
в точке x = b.
Граничные точки x = a и x = b, где граничные условия осуществляются, заданы в структуре исходного предположения solinit
. Для краевых задач 2D точки, 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
опции
Структура опцииСтруктура опции. Используйте функцию bvpset
, чтобы создать или изменить структуру опций.
Пример: options = bvpset('RelTol',1e-5,'Stats','on')
задает допуск относительной погрешности 1e-5
и включает отображение статистики решателя.
Типы данных: struct
sol - структура Решения
Структура решения. Можно получить доступ к полям в sol
с индексацией точки, таким как sol.field1
. Решение (sol.x
, sol.y
) непрерывно на интервале интегрирования, заданного в начальной mesh solinit.x
, и имеет непрерывную первую производную там. Можно использовать sol
с функцией deval
, чтобы оценить решение в других точках в интервале.
Структура sol
имеет эти поля.
Поле | Описание |
---|---|
| Mesh выбрана |
| Приближение к y (x) в точках mesh |
| Приближение к y ′ (x) в точках mesh |
| Окончательные значения для неизвестных параметров заданы в |
|
|
| Вычислительная статистика стоимости связана с решением: количество точек mesh, остаточной ошибки и количества вызовов |
Для многоточечных краевых задач граничные условия осуществляются в нескольких точках в интервале интегрирования.
bvp5c
может решить многоточечные краевые задачи, где a = a 0 < a 1 < a 2 < ... < a n = b является граничными точками в интервале [a, b]. Точки a 1, a 2... ,a n −1 представляет интерфейсы, которые делят [a, b] в области. bvp5c
перечисляет области слева направо (от a до b) с индексами, запускающимися от 1. В области k, [a k −1, a k], bvp5c
оценивает производную как
yp = odefun(x,y,k)
В функции граничных условий bcfun(yleft,yright)
yleft(:,k)
является решением на левом контуре [a k −1, a k]. Точно так же 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, b] с b> 0. Часто такие проблемы возникают при вычислении сглаженного решения ОДУ, которые следуют из дифференциальных уравнений с частными производными (УЧП) из-за цилиндрической или сферической симметрии. Для сингулярных проблем вы задаете (постоянный) матричный S
как значение опции 'SingularTerm'
bvpset
, и odefun
оценивает только f (x, y, p). Граничные условия и исходное предположение должны быть сопоставимы с необходимым условием для гладкости S · y (0) = 0.
Смотрите Решают BVP с Сингулярным Термином для примера, который решает сингулярную краевую задачу.
bvp5c
является кодом конечной разности, который реализует четырехэтапную формулу [1] Lobatto IIIa. Это - формула словосочетания, и полином словосочетания предоставляет C 1-непрерывное решение, которое является пятым порядком, точным однородно в [a,b]
. Формула реализована как неявная формула Рунге-Кутта. Некоторые различия между bvp5c
и bvp4c
:
bvp5c
решает алгебраические уравнения непосредственно. bvp4c
использует аналитическую конденсацию.
bvp4c
обрабатывает неизвестные параметры непосредственно. bvp5c
увеличивает систему с тривиальными дифференциальными уравнениями для неизвестных параметров.
[1] Шемпин, L.F., и Дж. Кирженка. "Решатель BVP, который Невязка Средств управления и Ошибка". Дж. Нумер. Анальный. Ind . Прикладная Математика. Издание 3 (1-2), 2008, стр 27–41.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.