exponenta event banner

Решение BVP с помощью продолжения

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

Для 0<e≪1 рассмотрим дифференциальное уравнение

ey +xy′=-eπ2cos (¼ x) -āxsin (¼ x).

Проблема возникает на интервале [-1,1] и подчиняется граничным условиям

y (-1) = -2,

y (1) = 0.

Когда e = 10-4, решение уравнения подвергается быстрому переходу вблизи x = 0, поэтому его трудно решить численно. Вместо этого в этом примере используется продолжение для итерации нескольких значений e до e = 10-4. Каждое из промежуточных решений используется в качестве первоначального предположения для следующей задачи.

Чтобы решить эту систему уравнений в MATLAB, необходимо кодировать уравнения, граничные условия и начальное предположение, прежде чем вызывать решатель задач граничных значений bvp4c. Требуемые функции можно либо включить в качестве локальных функций в конце файла (как здесь сделано), либо сохранить их как отдельные именованные файлы в каталоге по пути MATLAB.

Кодовое уравнение

Используя замены y1 = y и y2 = y ′, можно переписать уравнение как систему уравнений первого порядка

y1  = y2,

y2′=-xey -ls2cos (¼ x) -āxesin (¼ x).

Запись функции для кодирования уравнений с сигнатурой dydx = shockode(x,y), где:

  • x является независимой переменной.

  • y является зависимой переменной.

  • dydx(1) дает уравнение для y1 ′, иdydx(2) дает уравнение для y2 ′.

Сделайте функцию векторизованной, чтобы shockode([x1 x2 ...],[y1 y2 ...]) прибыль [shockode(x1,y1) shockode(x2,y2) ...]. Этот подход повышает производительность решателя.

Соответствующая функция:

function dydx = shockode(x,y)
pix = pi*x;
dydx = [y(2,:)
       -x/e.*y(2,:) - pi^2*cos(pix) - pix/e.*sin(pix)];
end

Примечание.В конце примера все функции включаются как локальные.

Граничные условия кода

Решатель BVP требует, чтобы граничные условия были в форме g (y (a), y (b)) = 0. В этой форме граничными условиями являются:

y (-1) + 2 = 0,

y (1) = 0.

Запись функции для кодирования граничных условий с сигнатурой res = shockbc(ya,yb), где:

  • ya - значение граничного условия в начале интервала [a, b].

  • yb - значение граничного условия в конце интервала [a, b].

Соответствующая функция:

function res = shockbc(ya,yb) % boundary conditions
res = [ya(1)+2
       yb(1)];
end

Кодовые якобинцы

Аналитические якобинцы для функции ОДУ и граничных условий могут быть легко вычислены в этой задаче. Предоставление якобинцев делает решатель более эффективным, так как решателю больше не нужно аппроксимировать их с конечными различиями.

Для функции ОДУ матрица Якобиана

JODE=∂f∂y=[∂f1∂y1∂f1∂y2∂f2∂y1∂f2∂y2]=[010-xe].

Соответствующая функция:

function jac = shockjac(x,y,e)
jac = [0   1
       0  -x/e];
end

Аналогично, для граничных условий матрицами якобиана являются

Jy (a) = [1000], Jy (b) = [0010].

Соответствующая функция:

function [dBCdya,dBCdyb] = shockbcjac(ya,yb)
dBCdya = [1 0; 0 0];
dBCdyb = [0 0; 1 0];
end

Начальное предположение формы

Используйте постоянное предположение для решения на сетке из пяти точек в [-1,1].

sol = bvpinit([-1 -0.5 0 0.5 1],[1 0]);

Уравнение решения

Если попытаться решить уравнение непосредственно с помощью e = 10-4, то решатель не сможет преодолеть плохое кондиционирование задачи вблизи точки перехода x = 0. Вместо этого для получения решения для e = 10-4 в этом примере используется продолжение путем решения последовательности задач для 10-2, 10-3 и 10-4. Выходные данные решателя в каждой итерации действуют как предположение для решения в следующей итерации (вот почему переменная для начального предположения отbvpinit является sol, и выходные данные решателя также называются sol).

Поскольку значение якобиана зависит от значения e, задайте опции в цикле, задающие shockjac и shockbcjac функции для якобинцев. Кроме того, включите векторизацию с shockode кодируется для обработки векторов значений.

e = 0.1;
for i = 2:4
   e = e/10;
   options = bvpset('FJacobian',@(x,y) shockjac(x,y,e),'BCJacobian',@shockbcjac,'Vectorized','on');
   sol = bvp4c(@(x,y) shockode(x,y,e),@shockbc, sol, options);
end

Решение для построения графика

Постройте график результатов из bvp4c для сетки x и раствора y (x). При продолжении решатель может обрабатывать разрывы при x = 0.

plot(sol.x,sol.y(1,:),'-o');
axis([-1 1 -2.2 2.2]);
title(['There Is a Shock at x = 0 When e =' sprintf('%.e',e) '.']);
xlabel('x');
ylabel('solution y');

Figure contains an axes. The axes with title There Is a Shock at x = 0 When e =1e-04. contains an object of type line.

Локальные функции

Здесь перечислены локальные функции решателя BVP bvp4c вызывает для вычисления решения. Кроме того, эти функции можно сохранить в виде собственных файлов в каталоге по пути MATLAB.

function dydx = shockode(x,y,e) % equation to solve
pix = pi*x;
dydx = [y(2,:)
       -x/e.*y(2,:) - pi^2*cos(pix) - pix/e.*sin(pix)];
end
%-------------------------------------------
function res = shockbc(ya,yb) % boundary conditions
res = [ya(1)+2
       yb(1)];
end
%-------------------------------------------
function jac = shockjac(x,y,e) % jacobian of shockode
jac = [0   1
       0  -x/e];
end
%-------------------------------------------
function [dBCdya,dBCdyb] = shockbcjac(ya,yb) % jacobian of shockbc
dBCdya = [1 0; 0 0];
dBCdyb = [0 0; 1 0];
end
%-------------------------------------------

См. также

| |

Связанные темы