exponenta event banner

bvpinit

Сформировать начальное предположение для решателя задач граничных значений

Описание

пример

solinit = bvpinit(x,yinit) использует начальную сетку x и начальное предположение о решении yinit для формирования начальной догадки решения для граничной задачи. Затем можно использовать начальное предположение solinit в качестве одного из входов в bvp4c или bvp5c для решения задачи граничного значения.

пример

solinit = bvpinit(sol,[anew bnew]) формирует начальное предположение для решения на интервале [anew bnew], где sol - структура раствора, полученная из bvp4c или bvp5c. Новый интервал [anew bnew] должен быть больше предыдущего интервала, на котором sol определяется. Предыдущее решение sol экстраполируется на новый интервал.

solinit = bvpinit(___,parameters) задает вектор начальных предположений для параметров с неизвестными значениями в задаче граничного значения. Этот синтаксис можно использовать с любой из предыдущих комбинаций входных аргументов.

Примеры

свернуть все

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

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

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

y = -y.

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

y (0) = y (δ) = 0.

Функция, которая кодирует уравнение как систему первого порядка,

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

Аналогично, функция, которая кодирует граничные условия,

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

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

Начальное предположение с дескриптором функции

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

function y = guess(x)
y = [sin(x)
     cos(x)];
end

Создайте структуру решения, используя 10 равноотстоящих точек сетки в области [0, δ] и функцию начального приближения.

xmesh = linspace(0,pi,10);
solinit = bvpinit(xmesh,@guess);

Решение BVP

Звонить bvp4c с функцией ode, граничными условиями и предположением решения. Постройте график результата.

sol = bvp4c(@bvpfun, @bcfun, solinit);
plot(sol.x,sol.y,'-o')

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

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

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

function dydx = bvpfun(x,y) % equation being solved
dydx = [y(2)
       -y(1)];
end
%-------------------------------------------
function res = bcfun(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)];
end
%-------------------------------------------
function y = guess(x) % guess at solution behavior
y = [sin(x)
     cos(x)];
end
%-------------------------------------------

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

Рассмотрим уравнение

y = y.

Как система первого порядка, уравнение становится системой двух уравнений

y1  = y2,

y2  = y1.

Уравнение первоначально определяется на интервале [0,3] и подчиняется граничным условиям

y (0) = 0,

y (3) = 1.

Функция, которая кодирует уравнение как систему первого порядка,

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

Аналогично, функция, которая кодирует граничные условия,

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

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

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

Используйте экспоненциальную функцию в качестве начального предположения для решения. Поскольку уравнение имеет два компонента решения, запишите начальную функцию приближения вида y = guess(x) возвращает вектор.

function y = guess(x)
y = [exp(x)
     exp(x)];
end

Сетки из пяти точек достаточно, чтобы зафиксировать поведение функции приближения.

xmesh = linspace(0,3,5);
solinit = bvpinit(xmesh,@guess);

Уравнение решения

Решите уравнение в начальном интервале [0,3] и постройте график результатов для y1.

sol = bvp4c(@bvpfun, @bcfun, solinit);
plot(sol.x(1,:),sol.y(1,:),'-o')

Figure contains an axes. The axes contains an object of type line.

Расширить интервал

Теперь используйте bvpinit расширение интервала интегрирования в цикл, решение и построение графика каждой новой задачи. В каждой итерации сформируйте начальное предположение, используя предыдущее решение sol экстраполируется на новый интервал [0 k]. В каждой новой проблеме, bvp4c обеспечивает выполнение граничных условий на новых границах [0 k].

hold on
for k = 4:8
    solinit = bvpinit(sol,[0 k]);
    sol = bvp4c(@bvpfun, @bcfun, solinit);
    plot(sol.x(1,:),sol.y(1,:),'-o')
end

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

В этом примере показана упрощенная версия продолжения, полезная методика решения BVP путем разбивания задачи на меньшие интервалы или более простые задачи. Дополнительные примеры этой методики см. в следующих разделах:

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

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

function dydx = bvpfun(x,y) % equation being solved
dydx = [y(2)
        y(1)];
end
%-------------------------------------------
function res = bcfun(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)-1];
end
%-------------------------------------------
function y = guess(x) % guess at solution behavior
y = [exp(x)
     exp(x)];
end
%-------------------------------------------

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

свернуть все

Начальная сетка, заданная как вектор. Для решения проблемы на интервале [a, b] укажитеx(1) как и x(end) как b. Записи x должен быть в порядке возрастания (если a < b) или в порядке убывания (если a > b). Решатель адаптирует эту сетку к решению (добавляя, удаляя и перемещая точки сетки). x = linspace(a,b,10) часто бывает достаточно. Чтобы справиться с трудными проблемами, разместите некоторые точки сетки там, где решение быстро изменяется.

  • Для двухточечных граничных проблем записи x должен быть уникальным. То есть, если a < b, записи должны удовлетворять x(1) < x(2) < ... < x(end). Если a > b, записи должны удовлетворять x(1) > x(2) > ... > x(end).

  • Для проблем с многоточечными граничными значениями можно указать точки в [a, b], в которых применяются граничные условия, отличные от конечных точек a и b, повторяя их записи вx. Например, рассмотрим вектор

    x = [0 0.5 1 1 1.5 2];
    Для этой сетки граничные условия применяются в трех точках: конечных точках 0 и 2и повторная запись 1. Как правило, повторяющиеся записи представляют граничные точки между областями в [a, b]. Повторная запись1 делит интервал [0 2] на два региона: [0 1] и [1 2].

Пример: solinit = bvpinit(linspace(a,b,10),yinit)

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного номера: Да

Начальное угадывание решения, определяемое как вектор или функция.

  • Вектор - для каждого компонента раствора, bvpinit реплицирует соответствующий элемент вектора в виде постоянной догадки по всем точкам сети. То есть yinit(i) является постоянным предположением для i-й компонент yinit(i,:) решения во всех точках сетки в x.

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

    y = guess(x)

    x является точкой сетки и y - вектор, длина которого совпадает с числом компонентов в решении. Например, если yinit является функцией, то в каждой точке сетки bvpinit требования

    y(:,j) = guess(x(j))

    Для проблем с многоточечными граничными значениями функция приближения должна иметь вид

    y = guess(x, k)

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

Пример: solinit = bvpinit(x,)

Пример: solinit = bvpinit(x,@guess)

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | function_handle
Поддержка комплексного номера: Да

Начальное предположение для неизвестных значений параметров, указанных как скаляр или вектор.

Пример: solinit = bvpinit(x, yinit, [0 1 sqrt(2)]) задает вектор догадок для трех неизвестных параметров.

Пример: Тип edit mat4bvp для просмотра примера BVP с неизвестным параметром.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного номера: Да

Предыдущее решение, указанное как структура решения, возвращаемая bvp4c или bvp5c. Если sol содержит параметры, они копируются в solinit.

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

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

свернуть все

Начальное предположение о решении, возвращенное как структура. Использовать эту структуру в качестве третьего ввода для bvp4c или bvp5c для решения задачи граничного значения.

См. также

| | | | |

Представлен до R2006a