В этом примере показано, как решить многоточечную краевую задачу, где решение интереса удовлетворяет условиям в интервале интегрирования.
Для \in , рассмотрите уравнения
,
.
Известные параметры проблемы , , , и .
Термин в уравнении для не является гладким в , таким образом, задача не может быть решена непосредственно. Вместо этого можно повредить проблему в два: один набор в интервале , и другой набор в интервале . Связь между этими двумя областями состоит в том, что решения должны быть непрерывными в . Решение должно также удовлетворить граничным условиям
,
.
Уравнения для каждой области
Область 1:
,
.
Область 2:
,
.
Интерфейсная точка включен в обе области. На данном этапе решатель производит оба левых и правых решения, которые должны быть равными, чтобы гарантировать непрерывность решения.
Чтобы решить эту систему уравнений в MATLAB, необходимо закодировать уравнения, граничные условия и исходное предположение прежде, чем вызвать решатель для краевой задачи bvp5c
. Вы любой может включать необходимые функции как локальные функции в конце файла (как сделано здесь) или сохранить их как отдельные, именованные файлы в директории на пути MATLAB.
Уравнения для и зависьте от решаемой области. Для многоточечных краевых задач производная функция должна принять третий входной параметр region
, который используется, чтобы идентифицировать область, где производная оценивается. Решатель нумерует области слева направо, начиная с 1.
Создайте функцию, чтобы закодировать уравнения с подписью dydx = f(x,y,region,p)
, где:
x
независимая переменная.
y
зависимая переменная.
dydx(1)
дает уравнение для , и dydx(2)
уравнение для .
region
количество области, где производная вычисляется (в этой проблеме 2D области, 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
столбец th YL(:,k)
решение на левом контуре k
область th. Точно так же YR(:,k)
решение на правильном контуре k
область th.
В этой проблеме, аппроксимирован 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)
обеспечить вектор из параметров.
Вычислите решение для нескольких значений , использование каждого решения как исходное предположение для следующего. Для каждого значения , вычислите значение osmolarity . Для каждой итерации цикла сравните вычисленное значение с аппроксимированным аналитическим решением.
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 %-------------------------------------------