MATLAB 数学应用 微分方程 边界值问题 求解具有未知参数的BVP

本文说明如何使用 bvp4c 求解具有未知参数的边界值问题。

马蒂厄方程在区间 [0,π] 上定义为

y ′ ′ + ( λ − 2 q   c o s ( 2 x ) ) y = 0 y'^{'} +(λ−2q cos(2x))y = 0 y+(λ2qcos(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 是表示特征值的未知参数。

您可以用代换法 y 1 = y 和 y 2 = y ′ y_1=y 和 y_2=y′ y1=yy2=y
将马蒂厄方程写成一阶方程组,

y 1 ′ = y 2 y_1' = y_2 y1=y2
y 2 ′ = − ( λ − 2 q   c o s ( 2 x ) ) y 1 y_2' = −(λ−2q cos(2x))y_1 y2=(λ2qcos(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

创建初始估计值

最后,创建解的初始估计值。您必须对两个解分量 y 1 = y ( x ) y_1=y(x) y1=y(x)
y 2 = y ′ ( x ) y_2=y'(x) y2=y(x)以及未知参数 λ 提供初始估计值。

对于此问题,余弦函数满足三个边界条件,因此有助于提供较好的初始估计值。使用返回 y 1 y_1 y1 y 2 y_2 y2 的估计值的函数,编写 y 的初始估计值的代码。

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

使用区间为 [0,π] 的 10 点网格、初始估计值函数以及 λ 的估计值 15 调用 bvpinit。

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

求解方程

使用 ODE 函数、边界条件函数和初始估计值调用 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 在区间 [0,π] 中的 100 个点处计算的解。

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

对两个解分量进行绘图。绘图显示了与第四个特征值 λ 4 = 17.097 λ_4=17.097 λ4=17.097
相关联的特征函数(及其导数)。

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
%-------------------------------------------
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值