Начальное предположение формы для решателя для краевой задачи
формирует начальное предположение для решения по интервалу solinit
= bvpinit(sol
,[anew bnew])[anew bnew]
, где sol
- структура решения, полученная из bvp4c
или bvp5c
. Новый интервал [anew bnew]
должен быть больше предыдущего интервала, на котором sol
задан. Предыдущее решение sol
экстраполируется на новый интервал.
задает вектор начальных догадок для параметров с неизвестными значениями в краевой задаче. Можно использовать этот синтаксис с любой из предыдущих комбинаций входных аргументов.solinit
= bvpinit(___,parameters
)
Создайте начальное предположение о решении BVP, решите BVP с bvp4c
, а затем расширить решение на новую область.
Формирование хорошего начального предположения о решении задачи BVP, пожалуй, самая сложная часть решения задачи. Решения BVP не обязательно являются уникальными, поэтому начальное предположение может быть решающим фактором, в каком из многих решений решатель возвращает. Начальное предположение должно удовлетворять граничным условиям, а поведение между ними должно отражать ваши общие ожидания относительно задачи (колеблется ли решение, является ли простая линейная функция и так далее...).
Рассмотрим дифференциальное уравнение
.
Уравнение удовлетворяет граничным условиям
.
Функция, которая кодирует уравнение как систему первого порядка,
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 в области и начальная функция предположения.
xmesh = linspace(0,pi,10); solinit = bvpinit(xmesh,@guess);
Решение BVP
Функции bvp4c
с функцией оды, граничными условиями и предположением решения. Постройте график результата.
sol = bvp4c(@bvpfun, @bcfun, solinit);
plot(sol.x,sol.y,'-o')
Локальные функции
Здесь перечислены локальные вспомогательные функции, которые решатель 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 на начальном интервале, а затем итеративно расширить интервал, используя каждое решение в качестве начального предположения для следующего интервала.
Рассмотрим уравнение
.
Как система первого порядка, уравнение становится системой двух уравнений
,
.
Уравнение первоначально определяется на интервале и удовлетворяет граничным условиям
,
.
Функция, которая кодирует уравнение как систему первого порядка,
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);
Решение уравнения
Решить уравнение в начальном интервале и постройте график результатов для .
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
Этот пример показывает упрощенную версию продолжения, полезный метод для решения 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 %-------------------------------------------
x
- Начальный meshИсходный 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];
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
Поддержка комплексного числа: Да
yinit
- Начальное предположение решенияНачальное предположение решения, заданное как вектор или функция.
Вектор - Для каждого компонента решения, bvpinit
повторяет соответствующий элемент вектора как постоянное предположение во всех точках mesh. То есть yinit(i)
является постоянным предположением для i
th-й компонент 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
Поддержка комплексного числа: Да
parameters
- Начальное предположение для неизвестных значений параметровНачальное предположение для неизвестных значений параметров, заданных как скаляр или вектор.
Пример: solinit = bvpinit(x, yinit, [0 1 sqrt(2)])
задает вектор догадок для трех неизвестных параметров.
Пример: Тип edit mat4bvp
чтобы увидеть пример BVP с неизвестным параметром.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
Поддержка комплексного числа: Да
sol
- Предварительное решениеПредшествующее решение, заданное как структура решения, возвращенная bvp4c
или bvp5c
. Если sol
содержит параметры, они копируются в solinit
.
Типы данных: struct
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.