bvpinit

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

Описание

пример

solinit = bvpinit(x,yinit) использует начальный mesh 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 одинаково разнесенных точек mesh в области [0,π] и начальная функция предположения.

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

Решение BVP

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

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

mesh из пяти точек достаточна, чтобы захватить поведение функции guess.

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
%-------------------------------------------

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

свернуть все

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

  • Для двухточечных краевых задач, значения 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];
    Для этого mesh граничные условия применяются в трех точках: конечных точках 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 повторяет соответствующий элемент вектора как постоянное предположение во всех точках mesh. То есть yinit(i) является постоянным предположением для ith-й компонент yinit(i,:) решения во всех точках mesh в x.

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

    y = guess(x)

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

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

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

    y = guess(x, k)

    y является начальным предположением для решения в x в области k. Функция должна принять входной параметр k, которая предусмотрена для гибкости в написании функции guess. Однако функция не требуется для использования 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