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