求解具有未知参数的 BVP
以下示例说明如何使用 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
使用区间为 的 10 点网格、初始估计值函数以及 的估计值 15 调用 bvpinit
。
lambda = 15; solinit = bvpinit(linspace(0,pi,10),@mat4init,lambda);
求解方程
使用 ODE 函数、边界条件函数和初始估计值调用 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 %-------------------------------------------