Этот пример показывает, как использовать bvp4c
, чтобы решить краевую задачу с неизвестным параметром.
Уравнение Мэтью определено на интервале
.
Когда параметр , граничные условия
,
.
Однако это только определяет до константы несколько, таким образом, третье условие требуется, чтобы задавать конкретное решение,
.
Чтобы решить эту систему уравнений в MATLAB, необходимо закодировать уравнения, граничные условия и исходное предположение прежде, чем вызвать решатель для краевой задачи bvp4c
. Можно или включать необходимые функции как локальные функции в конце файла (как сделано здесь) или сохранить их как отдельные, именованные файлы в директории на пути MATLAB.
Создайте функцию, чтобы закодировать уравнения. Эта функция должна иметь подпись dydx = mat4ode(x,y,lambda)
, где:
x
является независимой переменной.
y
является зависимой переменной.
lambda
является неизвестным параметром, представляющим собственное значение.
Можно записать уравнение Мэтью как систему первого порядка с помощью замен и ,
,
.
Соответствующая функция затем
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
является значением граничного условия в начале интервала .
yb
является значением граничного условия в конце интервала .
lambda
является неизвестным параметром, представляющим собственное значение.
Эта проблема имеет три граничных условия в интервале . Чтобы вычислить остаточные значения, необходимо поместить граничные условия в форму . В этой форме граничные условия
,
,
.
Соответствующая функция затем
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
Вызовите bvpinit
с помощью сетки 10 точек в интервале , функция исходного предположения и предположение 15 для значения .
lambda = 15; solinit = bvpinit(linspace(0,pi,10),@mat4init,lambda);
Вызовите bvp4c
с функцией ОДУ, функцией граничного условия и исходным предположением.
sol = bvp4c(@mat4ode, @mat4bc, solinit);
Распечатайте значение неизвестного параметра найденный bvp4c
. Это значение является четвертым собственным значением () из уравнения Мэтью.
fprintf('Fourth eigenvalue is approximately %7.3f.\n',... sol.parameters)
Fourth eigenvalue is approximately 17.097.
Используйте deval
, чтобы оценить решение, вычисленное bvp4c в 100 точках в интервале .
xint = linspace(0,pi); Sxint = deval(sol,xint);
Постройте оба компонента решения. График показывает собственную функцию (и ее производная) сопоставленный с четвертым собственным значением .
plot(xint,Sxint) axis([0 pi -4 4]) title('Eigenfunction of Mathieu''s Equation.') xlabel('x') ylabel('y') legend('y','y''')
Перечисленный здесь локальные функции помощника, которые решатель 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 %-------------------------------------------