В этом примере показано, как использовать 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
использование mesh из 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 %-------------------------------------------