Сформируйте исходное предположение для решателя для краевой задачи
формирует исходное предположение для решения на интервале 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
Сетка пяти точек достаточна, чтобы получить поведение функции предположения.
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
Этот пример показывает упрощенную версию продолжения, полезный метод, чтобы решить BVPs путем разламывания проблемы на меньшие интервалы или более простые проблемы. Для большего количества примеров этого метода см.:
Локальные функции
Перечисленный здесь локальные функции помощника что решатель 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, где решение изменяется быстро.
Для краевых задач 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];
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, функция предположения должна возвратить вектор, элементами которого являются предположения для соответствующих компонентов решения. Функция должна иметь форму
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
Поддержка комплексного числа: Да
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
backgroundPool
или ускорьте код с Parallel Computing Toolbox™ ThreadPool
.Эта функция полностью поддерживает основанные на потоке среды. Для получения дополнительной информации смотрите функции MATLAB Запуска в Основанной на потоке Среде.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.