bvpinit

Сформируйте исходное предположение для решателя для краевой задачи

Синтаксис

solinit = bvpinit(x,yinit)
solinit = bvpinit(sol,[anew bnew])
solinit = bvpinit(___,parameters)

Описание

пример

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')

Localfunctions

Перечисленный здесь локальные функции помощника, которые решатель 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')

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

Теперь, используйте 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

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

Localfunctions

Перечисленный здесь локальные функции помощника, которые решатель 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, где решение изменяется быстро.

  • Для краевых задач 2D точки записи 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 | логический
Поддержка комплексного числа: Да

Исходное предположение решения, заданного как вектор или функция.

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

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

    y = guess(x)

    x является точкой mesh, и y является вектором, длина которого совпадает с количеством компонентов в решении. Например, если yinit является функцией, то в каждой mesh указывают вызовы 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 | логический
Поддержка комплексного числа: Да

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

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

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

свернуть все

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

Смотрите также

| | | | |

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