Этот пример показов, как решить уравнение Эмдена, которое является краевым значением задачей с сингулярным слагаемым, который возникает при моделировании сферического тела газа.
После сокращения PDE модели с помощью симметрии уравнение становится ОДУ второго порядка, заданной на интервале ,
.
В , термин сингулярен, но симметрия подразумевает граничное условие . С этим граничным условием, термином хорошо определяется как . Для граничного условия BVP имеет аналитическое решение, которое можно сравнить с числовым решением, вычисленным в MATLAB ®,
.
Решатель BVP bvp4c
может решить сингулярные BVP, которые имеют вид
.
Матрица должны быть постоянными, а граничные условия должен соответствовать необходимому условию . Используйте 'SingularTerm'
опция bvpset
для прохождения S
матрица к решателю.
Можно переписать уравнение Эмдена как систему уравнений первого порядка используя и как
,
.
Граничные условия становятся
,
.
В необходимой матричной форме система
.
В матричной форме ясно, что и .
Чтобы решить эту систему уравнений в MATLAB, необходимо кодировать уравнения, граничные условия и опции перед вызовом решателя для краевой задачи bvp4c
. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.
Создайте функцию, чтобы кодировать уравнения для . Эта функция должна иметь подпись dydx = emdenode(x,y)
, где:
x
- независимая переменная.
y
- зависимая переменная.
dydx(1)
приводит уравнение для , и dydx(2)
уравнение для .
Эти входы автоматически передаются функции решателем, но имена переменных определяют, как вы кодируете уравнения. В этом случае:
function dydx = emdenode(x,y) dydx = [y(2) -y(1)^5]; end
Термин, который содержит S
передается решателю с помощью опций, так что термин не включается в функцию.
Теперь напишите функцию, которая возвращает остаточное значение граничных условий в граничных точках. Эта функция должна иметь подпись res = emdenbc(ya,yb)
, где:
ya
- значение граничного условия в начале интервала.
yb
- значение граничного условия в конце интервала.
Для этой задачи одно из граничных условий для , а другой - для . Чтобы вычислить остаточные значения, необходимо поместить граничные условия в форму .
В этой форме граничные условия
,
.
Соответствующая функция тогда
function res = emdenbc(ya,yb) res = [ya(2) yb(1) - sqrt(3)/2]; end
Наконец, создайте начальное предположение о решении. Для этой задачи используйте постоянное начальное предположение, которое удовлетворяет граничным условиям, и простой mesh из пяти точек между 0 и 1. Использование многих сетчатый не требуется, поскольку решатель BVP адаптирует эти точки в процессе решения.
,
.
guess = [sqrt(3)/2; 0]; xmesh = linspace(0,1,5); solinit = bvpinit(xmesh, guess);
Создайте матрицу для S
и передайте его в bvpset
как значение 'SingularTerm'
опция. Наконец, позвоните bvp4c
с функцией ОДУ, функцией граничных условий, начальным предположением и структурой опций.
S = [0 0; 0 -2];
options = bvpset('SingularTerm',S);
sol = bvp4c(@emdenode, @emdenbc, solinit, options);
Вычислим значение аналитического решения в .
x = linspace(0,1); truy = 1 ./ sqrt(1 + (x.^2)/3);
Постройте график аналитического решения и решения, рассчитанного по bvp4c
для сравнения.
plot(x,truy,sol.x,sol.y(1,:),'ro'); title('Emden Problem -- BVP with Singular Term.') legend('Analytical','Computed'); xlabel('x'); ylabel('solution y');
Здесь перечислены локальные вспомогательные функции, которые решатель BVP bvp4c
вызывается для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.
function dydx = emdenode(x,y) % equation being solved dydx = [y(2) -y(1)^5]; end %------------------------------------------- function res = emdenbc(ya,yb) % boundary conditions res = [ya(2) yb(1) - sqrt(3)/2]; end %-------------------------------------------
bvp4c
| bvp5c
| bvpinit
| bvpset