今天看matlab数学文档的时候,发现可以使用bvp4c和bvp5c这两个求解器解决两点边值问题(Boundary Value Problem, BVP),上网搜了一下,发现优快云上有人用bvp4c解决了一个最优控制问题,下面是对他的博客的个人理解。
【理论】
bvp4c函数用于数值求解两点边值问题,作为Matlab中对ode系列函数的补充。ode系列函数只能数值求解具有初值的常微分方程。
调用格式为
sol = bvp4c(@odefun, @bcfun, solinit, options, p1, p2, ...)
(1)odefun 为微分方程的函数句柄,调用格式为
function dydx = odefun(x, y, p1, p2, ...)
其中,x 为标量,y 是列向量,p1 和 p2 以及剩下的参数是在主函数中和 x 、y 有关的系数。odefun(x, y)必须返回列向量 dydx ,表示 f ( x , y ) f(x,y) f(x,y)。
(2)bcfun 为微分方程的边界条件句柄,调用格式为
function res = bcfun(ya, yb, p1, p2, ...)
其中,ya 为初值,yb 是终值,均为列向量,p1 和 p2 以及剩下的参数是在主函数中和 x 、y 有关的系数,res 为输出,是列向量。需要注意的是,若在实际问题中, y a ( t 0 ) ya(t_0) ya(t0)的值为 a a a,即 y a ( t 0 ) = a ya(t_0)=a ya(t0)=a,则在函数中应写成ya - a,yb也是一样。
(3)solinit 为初始估计解的结构体。使用bvpinit函数创建,调用格式为
solinit = bvpinit(x, y)
其中,x 向量为初始网格的排序节点,应满足边界条件a=solinit.x(1)和b=solinit.x(end)。y 是为初始估计解,使得solinit.y(:,i)为在solinit.x(i)节点处的初始估计解。以常值作为初始猜测值,此处初值可以任意设置,若任意设置的初值无法解算出合理结果,则可考虑使用continuation方法设置初值,可参考这篇文章。
(4)options 为可选积分参数。使用bvpset函数创建,调用格式为
options = bvpset('name1','para1','name2','para2',...)
一般情况可用[]代替。
(5)输出sol为结构体,为特定数量点对应的解,其所包含的字段如下表所示。为使曲线变得更光滑,需要在中间插入一些点,使用deval函数,sxint=deval(sol,xint), 其中,xint为点向量,函数deval根据这些点向量求解。sol为函数bvp4c的输出。
| 参数 | 功能 |
|---|---|
| sol.x | Bvp4c 选择的网格 |
| sol.y | sol.x 网格点处y(x)的近似值 |
| sol.yp | sol.x 网格点处y’(x)的近似值 |
| sol.parameters | bvp4c 针对未知参数返回的值(如果有) |
| sol.solver | ‘bvp4c’ |
| sol.stats | 计算成本统计信息(当设置stats选项和bvpset时,会显示此信息) |
【例题】求解最优控制问题-有约束的停车能耗最优控制
初始时刻车辆位置为 x 1 ( 0 ) = − 2 x_1(0)=-2 x1(0)=−2,速度为 x 2 ( 0 ) = 1 x_2(0)=1 x2(0)=

本文介绍了如何利用Matlab中的bvp4c函数解决带有约束的停车能耗最优控制问题,包括理论背景、函数调用和一个具体实例。通过bvp4c求解微分方程和边界条件,优化能耗性能指标并展示了实际代码实现和仿真结果。
最低0.47元/天 解锁文章
867

被折叠的 条评论
为什么被折叠?



