矩阵 S 必须为常量,x=0 处的边界条件必须与必要条件 S⋅y(0)=0 一致。使用 bvpset 的 ‘SingularTerm’ 选项将 S 矩阵传递给求解器。
您可以使用 \begin{bmatrix} y_1' \\ y_2' \end{bmatrix} = \dfrac{1}{x} \begin{bmatrix} 0 & 0 \\ 0 & -2 \end{bmatrix} \begin{bmatrix} y_1 \\ y_2 \end{bmatrix} + \begin{bmatrix} y_2 \\ -y_1^5 \end{bmatrix}。 [ y 1 ′ y 2 ′ ] = x 1 [ 0 0 0 − 2 ] [ y 1 y 2 ] + [ y 2 − y 1 5 ] 。
采用矩阵形式时,很明显, [ y 2 − y 1 5 ] 。
要在 MATLAB 中对此方程组求解,您需要先编写方程组、边界条件和选项的代码,然后再调用边界值问题求解器 bvp4c。您可以将所需的函数作为局部函数包含在文件末尾,或者将它们作为单独的命名文件保存在 MATLAB 路径上的目录中。
创建一个函数以用于编写 f(x,y) 的方程代码。此函数应具有签名 dydx = emdenode(x,y),其中:
x 是自变量。
y 是因变量。
dydx(1) 给出 y 2 ′ 的方程。
求解器会自动将这些输入传递给该函数,但是变量名称决定如何编写方程代码。在这种情况下:
function dydx = emdenode(x,y) dydx = [y(2) -y(1)^5];
包含 S 的项通过选项传递给求解器,因此该项不包含在函数中。
编写边界条件代码
现在,编写一个函数,该函数返回在边界点处的边界条件的残差值。此函数应具有签名 res = emdenbc(ya,yb),其中:
- ya 是在区间的开始处的边界条件的值。
- yb 是在区间的结束处的边界条件的值。
对于此问题,一个边界条件针对
guess = [sqrt(3)/2; 0]; xmesh = linspace(0,1,5); solinit = bvpinit(xmesh, guess);
为 S 创建矩阵,并将其作为 ‘SingularTerm’ 选项的值传递给 bvpset。最后,使用 ODE 函数、边界条件函数、初始估计值和 options 结构体调用 bvp4c。
S = [0 0; 0 -2]; options = bvpset('SingularTerm',S); sol = bvp4c(@emdenode, @emdenbc, solinit, options);
对解进行绘图
计算 [0,1] 中解析解的值。
x = linspace(0,1); truy = 1 ./ sqrt(1 + (x.^2)/3);
绘制解析解和 bvp4c 计算的解,以进行比较。
plot(x,truy,sol.x,sol.y(1,:),'ro'); title('Emden Problem -- BVP with Singular Term.') legend('Analytical','Computed'); xlabel('x'); ylabel('solution y');
此处列出了 BVP 求解器 bvp4c 为计算解而调用的局部辅助函数。您也可以将这些函数作为它们自己的文件保存在 MATLAB 路径上的目录中。
function dydx = emdenode(x,y) % equation being solved dydx = [y(2) -y(1)^5]; %------------------------------------------- function res = emdenbc(ya,yb) % boundary conditions res = [ya(2) yb(1) - sqrt(3)/2]; %------------------------------------------- 本文讲述了如何求解埃姆登方程,埃姆登方程是一个具有奇异项的边界值问题,源于对气体球体建模的过程。在使用对称性法简化模型的 PDE 后,该方程变为在区间 [0,1] 上定义的二阶 ODE,y′′+2xy′+y5=0y'' + \dfrac{2}{x}y' + y^5 = 0y′′+x2y′+y5=0。在 x=0 处,(2/x) 项具有奇异性,但对称性表示边界条件 y′(0)=0。通过此边界条件,项 (2/x)y′ 可以很好地定义为 x→0。对于边界条件 y(1)=3/2y(1) = \sqrt{3}/
函数非线性BVP_FDM .m 是一般非线性的非线性有限差分法边值问题 --------------------------------------------- y''=f(x,y,y'),对于 a<x<b,其中 y(a)=alpha 且 y(b)=beta。 -------------------------------------------------- -------------------------- 区间[a,b]被分成(N+1)个相等的子区间端点在 x(i)=a+i*h 处,i=0,1,2,...,N+1。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 评论: 函数 f 应该定义为一个 m 文件。 不需要 f 的偏导数见给定的例子%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 例子求解非线性边值问题y''=(1/8)*我第一次接触bvp4c函数是在《最优控制》课程上。例2是课程上布置的利用bvp4c函数求解最优控制的问题。本篇文章是我参考文末的材料加上自己的理解编写而成。 bvp4c函数用于数值求解两点边值问题,作为Matlab中对ode系列函数的补充。ode系列函数只能数值求解具有初值的常微分方程。 1、调用格式 sol = bvp4c(odefun,bcfun,solinit,options,p1,p...sol = bvp4c(odefun,bcfun,solinit,options) sol = bvp4c(odefun,bcfun,solinit,options,p1,p2...) sol返回如下值 sol.x bvp4c选择的网格 sol.y 在网格点sol.x的 y(x)的接近值今天看matlab数学文档的时候,发现可以使用bvp4c和bvp5c这两个求解器解决两点边值问题(Boundary Value Problem, BVP),上网搜了一下,发现CSDN上有人用bvp4c解决了一个最优控制问题,下面是对他的博客的个人理解。 bvp4c函数用于数值求解两点边值问题,作为Matlab中对ode系列函数的补充。ode系列函数只能数值求解具有初值的常微分方程。 调用格式为 sol = bvp4c(@odefun, @bcfun, solinit, options, p1, pMatlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用ODE45,对刚性度(?stiff)问题采用ODE15S。(对于stiffness的解释,请参照“什么是Stiffness”一节。) 2. 微分-代数方程(DAEs)的初值问题 在那些守恒定律规定一些变量之间满足常数关系领域经常遇到这类问题。Matlab 可以用ODE15S 或者 ODE23T解决索引(index)为1的DAEs。(对于索引的解释,请参阅“DAEs与他们的索引”一章。) 3. 边界值问题(BVPs) 这种通常要求微分方程在两边都具有特殊的条件组成。尽管他们通常不象IVPs那样经常遇到,但是他们也是工程应用中比较常见的问题。可以利用函数BVP4C来解决这类问题。 4. 时延微分方程(DDEs) 这类微分方程包含了独立变量的延迟。他们在生物与化学模型这类大量的应用中遇到,可以通过DDE23来解决这类问题。 5. 偏微分方程(PDEs) 采用PDEPE可以解决一维时空的抛物面与椭圆方程的初值、边界值的问题。而那些对更加多的一般的偏微分方程感兴趣的可以利用PDE工具箱。 更多的matlab的综合应用技术的信息请参阅Solution8314。 更多的有关matlab采用的各种求解器的算法的信息请查看下面的URLs: ● ODE 函数 ● BVP 函数 ● DDE 函数 ● PDE 函数 第2节 可以从什么地方获得更多的指导与附加信息? 可以从MATLAB Center、网站的新闻组、文件交换点可以获得一系列资料,可以进一步解释MATLAB解决各种方程(ODE,DAE,BVP,DDE)的求解器的算法和使用。你可以下载各种方程的文章与手册,他们通常带有大量的实例。 可以从 matlab自带的帮助文件的 Mathematics|Differential Equations下找到使用指导。 Cleve Moler的《Numerical Computing with MATLAB》的第七章详细讨论了OEDs的解法,并附带有大量的实例与简单的问题练习。 第3节 对ODE求解器的语法存在有些什么变化? 在MATLAB6.5(R13)中应用ODE求解器求解的首选语法是: [t,y]=odesolver(odefun,tspan,y0,options,parameter1,parameter2,…,parameterN); odesolver 是你采用的求解器,例如ODE45或者ODE15S。odefun是微分方程的定义函数,所以odefun定义独立参数(典型的是时间t)的导数y‘ 以及y和其他的参数。在MATLAB6.5(R13)中,推荐使用函数句柄作为odefun。 例如,ode45(@xdot,tspan,y0),而不是用 ode45('xdot',tspan,y0)。 请看采用函数句柄的好处的文档: 采用函数句柄传递你定义MATLAB求解器计算的量、例如大规模矩阵或者Jacobian模式的函数。 如果你喜好采用字符串儿传递你的函数,matlab求解器将回溯匹配。 在老的matlab版本里,通过传递标志来规定求解器的状态和恰当的计算。在MATALB6.0以及其后的版本中,这就没有必要了,可以从matlab自带的文档中发现这个差别。 如果里采用的matlab的ODE求解器的老的语法,你可以看看我们FTP站点上的各种求解器的老的实例: ftp://ftp.mathworks.com/pub/doc/papers/ 前面的站点包含了BVP,DAE与DDE这三个方向的采用老的语法的实例。你可以在下面的站点中找到应用ODE45与ODE23的实例: ftp://ftp.mathworks.com/pub.mathworks/toolbox/matlab/funfun 你可以在MATLAB Center的文件交换站点查看这些例子的更新版本。 第4节 如何减小ODE的阶次? 求解一阶ODE的代码是很直接的。然而,二阶或者三阶的ODE不能够直接应用求解。你必须先将高阶的ODE改写成一阶的ODEs系统,使得它可以采用MATLAB ODE求解器。 这是一个如何将二阶微分方程改写成两个一阶微分 sol = bvp4c(odefun,bcfun,solinit) sol = bvp4c(odefun,bcfun,solinit,options) sol = bvp4c(odefun,bcfun,solinit,options,p1,p2...) sol返回如下值 sol.x bvp4c选择的网格 sol.y 在网格点sol.x...MATLAB 使用算法来生成伪随机数和伪独立数。这些数在数学意义上并非严格随机和独立的,但它们能够通过各种随机和独立统计测试,并且其计算可以重复,方便用于测试或诊断目的。 rand、randi、randn 和 randperm 函数是创建随机数数组的主要函数。rng 函数允许您控制生成随机数的种子和算法。 随机数函数 有四种基本随机数函数:rand、randi、randn 和 randperm。rand 函数返回在 0 和 1 之间均匀分布的实数。例如: rng('default') r1 = rand(1在边界值问题 (BVP) 中,目标是求常微分方程 (ODE) 的解,该解还需满足某些指定的边界条件。边界条件指定积分区间中两个或多个位置处的解的值之间的关系。在最简单的情形中,边界条件适用于区间的开始和结束(即边界)。 MATLAB中BVP求解器 bvp4c 和 bvp5c 用于处理以下形式的 ODE 方程组: y′=f(x,y) x 是自变量 y 是因变量 y’ 表示 y 关于 x 的导数,也写为 dy/dx 在两点 BVP 的最简单情形中,ODE 的解在区间 [a, b] 中求得,在MATLAB中求解边界值微分方程可以使用`bvp4c`函数。`bvp4c`函数是MATLAB的边界值问题求解器,可以用于求解一般的常微分方程边界值问题。以下是一个示例代码,演示如何使用`bvp4c`函数求解边界值微分方程: ```matlab function boundary_value_problem() % 定义边界条件 solinit = bvpinit(linspace(0, 1, 100), @guess); % 求解边界值微分方程 sol = bvp4c(@ode, @bc, solinit); % 绘制解 x = linspace(0,1, 100); y = deval(sol, x); plot(x, y(1, :)); xlabel('x'); ylabel('y'); title('Boundary Value Problem Solution'); function dydx = ode(x, y) % 定义微分方程 dydx = [y(2); -y(1)]; function res = bc(ya, yb) % 定义边界条件 res = [ya(1); yb(1) - 1]; function guess = guess(x) % 初值猜测 guess = [sin(pi*x); pi*cos(pi*x)]; 在上述代码中,`ode`函数定义了微分方程,`bc`函数定义了边界条件,`guess`函数用于提供初值猜测。首先,通过调用`bvpinit`函数初始化求解器,然后调用`bvp4c`函数进行求解。最后,使用`deval`函数获取求解结果,并绘制出解的图像。 你可以根据自己的具体问题,修改`ode`、`bc`和`guess`函数来适应不同的边界值微分方程求解问题。