Решите BVP с неизвестным параметром

Этот пример показывает, как использовать bvp4c, чтобы решить краевую задачу с неизвестным параметром.

Уравнение Мэтью определено на интервале [0,π]

y+(λ-2qпотому что(2x))y=0.

Когда параметр q=5, граничные условия

y(0)=0,

y(π)=0.

Однако это только определяет y(x) до константы несколько, таким образом, третье условие требуется, чтобы задавать конкретное решение,

y(0)=1.

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

Уравнение кода

Создайте функцию, чтобы закодировать уравнения. Эта функция должна иметь подпись dydx = mat4ode(x,y,lambda), где:

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

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

  • lambda является неизвестным параметром, представляющим собственное значение.

Можно записать уравнение Мэтью как систему первого порядка с помощью замен y1=y и y2=y,

y1=y2,

y2=-(λ-2qпотому что(2x))y1.

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

function dydx = mat4ode(x,y,lambda) % equation being solved
dydx = [y(2)
      -(lambda - 2*q*cos(2*x))*y(1)];
end

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

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

Теперь, запишите функцию, которая возвращает остаточное значение граничных условий в граничных точках. Эта функция должна иметь подпись res = mat4bc(ya,yb,lambda), где:

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

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

  • lambda является неизвестным параметром, представляющим собственное значение.

Эта проблема имеет три граничных условия в интервале [0,π]. Чтобы вычислить остаточные значения, необходимо поместить граничные условия в форму g(x,y)=0. В этой форме граничные условия

y(0)=0,

y(π)=0,

y(0)-1=0.

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

function res = mat4bc(ya,yb,lambda) % boundary conditions
res = [ya(2)
       yb(2)
       ya(1)-1];
end

Создайте исходное предположение

Наконец, создайте исходное предположение решения. Необходимо обеспечить исходное предположение для обоих компонентов решения y1=y(x) и y2=y(x), а также неизвестный параметр λ.

Для этой проблемы косинусная функция делает для хорошего исходного предположения, поскольку это удовлетворяет эти три граничных условия. Закодируйте исходное предположение для y использование функции, которая возвращает предположение для y1 и y2.

function yinit = mat4init(x) % initial guess function
yinit = [cos(4*x)
        -4*sin(4*x)];
end

Вызовите bvpinit с помощью сетки 10 точек в интервале [0,π], функция исходного предположения и предположение 15 для значения λ.

lambda = 15;
solinit = bvpinit(linspace(0,pi,10),@mat4init,lambda);

Решите уравнение

Вызовите bvp4c с функцией ОДУ, функцией граничного условия и исходным предположением.

sol = bvp4c(@mat4ode, @mat4bc, solinit);

Значение параметра

Распечатайте значение неизвестного параметра λ найденный bvp4c. Это значение является четвертым собственным значением (q=5) из уравнения Мэтью.

fprintf('Fourth eigenvalue is approximately %7.3f.\n',...
            sol.parameters)
Fourth eigenvalue is approximately  17.097.

Постройте решение

Используйте deval, чтобы оценить решение, вычисленное bvp4c в 100 точках в интервале [0,π].

xint = linspace(0,pi);
Sxint = deval(sol,xint);

Постройте оба компонента решения. График показывает собственную функцию (и ее производная) сопоставленный с четвертым собственным значением λ4=17.097.

plot(xint,Sxint)
axis([0 pi -4 4])
title('Eigenfunction of Mathieu''s Equation.') 
xlabel('x')
ylabel('y')
legend('y','y''')

Localfunctions

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

function dydx = mat4ode(x,y,lambda) % equation being solved
q = 5;
dydx = [y(2)
      -(lambda - 2*q*cos(2*x))*y(1)];
end
%-------------------------------------------
function res = mat4bc(ya,yb,lambda) % boundary conditions
res = [ya(2)
       yb(2)
       ya(1)-1];
end
%-------------------------------------------
function yinit = mat4init(x) % initial guess function
yinit = [cos(4*x)
        -4*sin(4*x)];
end
%-------------------------------------------

Смотрите также

| |

Похожие темы