Этот пример показов, как решить многоточечную краевую значения задачу, где интересующее решение удовлетворяет условиям внутри интервала интегрирования.
Для в , рассмотрите уравнения
,
.
Известными параметрами задачи являются , , , и .
Термин в уравнении для не гладко при так что проблему нельзя решить напрямую. Вместо этого можно разбить задачу на две части: один набор в интервале , и другой набор в интервале . Связь между двумя областями состоит в том, что решения должны быть непрерывными . Решение должно также удовлетворять граничным условиям
,
.
Уравнения для каждой области
Область 1:
,
.
Область 2:
,
.
Точка интерфейса входит в обе области. На данной точке решатель вырабатывает как левое, так и правое решения, которые должны быть равными, чтобы гарантировать непрерывность решения.
Чтобы решить эту систему уравнений в MATLAB, необходимо кодировать уравнения, граничные условия и исходное предположение перед вызовом решателя для краевой задачи bvp5c
. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.
Уравнения для и зависят от решаемой области. Для многоточечных граничных задач значения производная функция должна принять третий входной параметр region
, который используется для идентификации области, в которой оценивается производная. Решатель нумерует области слева направо, начиная с 1.
Создайте функцию, чтобы кодировать уравнения сигнатурой dydx = f(x,y,region,p)
, где:
x
- независимая переменная.
y
- зависимая переменная.
dydx(1)
приводит уравнение для , и dydx(2)
уравнение для .
region
количество области, в которой вычисляется производная (в этой двухрегиональной задаче region
является 1
или 2
).
p
- вектор, содержащий значения постоянных параметров .
Используйте оператор switch, чтобы вернуть различные уравнения в зависимости от области, которая решается. Функция является
function dydx = f(x,y,region,p) % equations being solved n = p(1); eta = p(4); dydx = zeros(2,1); dydx(1) = (y(2) - 1)/n; switch region case 1 % x in [0 1] dydx(2) = (y(1)*y(2) - x)/eta; case 2 % x in [1 lambda] dydx(2) = (y(1)*y(2) - 1)/eta; end end
Примечание.Все функции включены в качестве локальных функций в конце примера.
Решение двух дифференциальных уравнений первого порядка в двух областях требует четырех граничных условий. Два из этих условий являются результатом первоначальной задачи:
,
.
Другие два условия обеспечивают непрерывность левых и правых решений в точке интерфейса :
,
.
Для многоточечных BVP аргументы граничных условий функционируют YL
и YR
стать матрицами. В частности, k
первый столбец YL(:,k)
- решение на левом контуре k
I область. Точно так же YR(:,k)
является решением на правом контуре k
I область.
В этой задаче, аппроксимируется YL(:,1)
, в то время как аппроксимируется YR(:,end)
. Непрерывность решения при требует, чтобы YR(:,1) = YL(:,2)
.
Функция, которая кодирует остаточное значение четырех граничных условий,
function res = bc(YL,YR) res = [YL(1,1) % v(0) = 0 YR(1,1) - YL(1,2) % Continuity of v(x) at x=1 YR(2,1) - YL(2,2) % Continuity of C(x) at x=1 YR(2,end) - 1]; % C(lambda) = 1 end
Для многоточечных BVP, граничные условия автоматически применяются в начале и конце интервала интегрирования. Однако необходимо задать двойные значения в xmesh
для других точек интерфейса. Простое предположение, которое удовлетворяет граничным условиям, является постоянным предположением y = [1; 1]
.
xc = 1; xmesh = [0 0.25 0.5 0.75 xc xc 1.25 1.5 1.75 2]; yinit = [1; 1]; sol = bvpinit(xmesh,yinit);
Задайте значения постоянных параметров и поместите их в вектор p
. Предоставьте функцию для bvp5c
с синтаксисом @(x,y,r) f(x,y,r,p)
для предоставления вектора параметров.
Вычислим решение для нескольких значений , использование каждого решения в качестве начального предположения для следующего. Для каждого значения , вычислите значение осмолярности . Для каждой итерации цикла сравните вычисленное значение с приблизительным аналитическим решением.
lambda = 2; n = 5e-2; for kappa = 2:5 eta = lambda^2/(n*kappa^2); p = [n kappa lambda eta]; sol = bvp5c(@(x,y,r) f(x,y,r,p), @bc, sol); K2 = lambda*sinh(kappa/lambda)/(kappa*cosh(kappa)); approx = 1/(1 - K2); computed = 1/sol.y(1,end); fprintf(' %2i %10.3f %10.3f \n',kappa,computed,approx); end
2 1.462 1.454 3 1.172 1.164 4 1.078 1.071 5 1.039 1.034
Постройте график компонентов решения для и и вертикальную линию в точке интерфейса . Отображаемое решение для результаты окончательной итерации цикла.
plot(sol.x,sol.y(1,:),'--o',sol.x,sol.y(2,:),'--o') line([1 1], [0 2], 'Color', 'k') legend('v(x)','C(x)') title('A Three-Point BVP Solved with bvp5c') xlabel({'x', '\lambda = 2, \kappa = 5'}) ylabel('v(x) and C(x)')
Здесь перечислены локальные вспомогательные функции, которые решатель BVP bvp5c
вызывается для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.
function dydx = f(x,y,region,p) % equations being solved n = p(1); eta = p(4); dydx = zeros(2,1); dydx(1) = (y(2) - 1)/n; switch region case 1 % x in [0 1] dydx(2) = (y(1)*y(2) - x)/eta; case 2 % x in [1 lambda] dydx(2) = (y(1)*y(2) - 1)/eta; end end %------------------------------------------- function res = bc(YL,YR) % boundary conditions res = [YL(1,1) % v(0) = 0 YR(1,1) - YL(1,2) % Continuity of v(x) at x=1 YR(2,1) - YL(2,2) % Continuity of C(x) at x=1 YR(2,end) - 1]; % C(lambda) = 1 end %-------------------------------------------