You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对给定非线性系统进行离散化(基于Matlab与Casadi实现MPC)

非线性系统离散化实现方法(Matlab + Casadi)

你给出的一阶标量自治非线性系统有两种成熟的离散化实现方案,适配MPC开发需求:

方案1:解析离散化(优先推荐)

该系统可通过分离变量积分得到闭式离散解,无截断误差,计算效率最高,完全适配Casadi符号运算与自动微分特性。

推导过程:
对原方程 dx/dt = C*x/(x^2 + 1) 做分离变量得 (x^2+1)/x dx = C dt,两侧积分后代入t=0时刻初始状态x_k,可得t=T(采样时间)时刻的状态表达式:
x_{k+1} = sign(x_k) * sqrt( e^{2*C*T}*(x_k^2 + 1) - 1 )

Matlab+Casadi实现代码:

import casadi.*
% 定义符号变量
x = MX.sym('x'); % 系统状态
C = MX.sym('C'); % 常数参数,取值范围0~1
T = 0.1; % 采样时间,可根据实际控制需求调整

% 构建解析离散化表达式
x_next = sign(x) * sqrt( exp(2*C*T)*(x^2 + 1) - 1 );

% 生成可调用的离散动力学函数,可直接接入MPC优化框架
discrete_dyn = Function('discrete_dyn', {x, C}, {x_next});

方案2:数值离散化(通用扩展方案)

如果后续需要适配更复杂的无解析解的非线性系统,可采用数值积分方法离散化,MPC场景下优先选择四阶龙格库塔(RK4)方法,兼顾精度与计算效率。

Matlab+Casadi实现代码:

import casadi.*
x = MX.sym('x');
C = MX.sym('C');
T = 0.1; % 采样时间

% 定义连续状态方程
ode = C * x/(x^2 + 1);
ode_fun = Function('ode', {x, C}, {ode});

% RK4积分步骤
k1 = ode_fun(x, C);
k2 = ode_fun(x + T/2*k1, C);
k3 = ode_fun(x + T/2*k2, C);
k4 = ode_fun(x + T*k3, C);
x_next = x + T/6*(k1 + 2*k2 + 2*k3 + k4);

% 生成离散动力学函数
discrete_dyn_rk4 = Function('discrete_dyn_rk4', {x, C}, {x_next});

补充说明:

  • 若采样时间极短、预测时域不长,也可使用更简单的前向欧拉离散化:x_next = x + T * ode_fun(x, C);,但长时域下误差累积明显,不推荐使用
  • 两种方案生成的Casadi函数均支持直接接入Casadi Opti优化框架搭建MPC控制器,兼容C代码生成部署需求

内容的提问来源于stack exchange,提问作者mkloster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:39:02