Simulink建模与仿真学习笔记之N维查找表(n-D Lookup Table)(插值算法)

模块简介

所在库:Simulink -> Lookup Tables

说明:这3个模块的功能是一样的,区别是默认的表数据维度不同。

 

插值算法

默认的算法是线性算法:

输出方式

 

内插算法

有四种:

当输入位于两个断点值之间时,模块将根据相邻断点内插输出值。大多数查找表模块提供了以下内插方法:

  • Flat” - 禁用插值,并使用名为 “Use Input Below” 的舍入操作。有关详细信息,请参阅 舍入方法

  • Nearest” - 禁用内插,并返回与最接近输入的断点对应的表值。如果输入与两个相邻断点之间的距离相等,则选择索引值较大的断点。

  • Linear” - 在相邻断点之间拟合一条线,并返回该线条上与输入对应的点。

  • Cubic spline” - 在相邻断点之间拟合一条三次样条曲线,并返回该样条曲线上与输入对应的点。

 

 

外插算法

有三种:

  • Clip” - 禁用外插,并返回与断点数据集范围的端点对应的表数据。此方法对超出范围的值无任何保证。

  • Linear” - 如果插值方法为 “Linear”,此外插方法将在第一对断点间或最后一对断点间拟合一条线,具体取决于输入是小于第一个断点还是大于最后一个断点。如果插值方法为 “Cubic spline”,此外插方法将使用插值函数在第一个或最后一个断点处的斜率来拟合一个线性曲面,具体取决于输入是小于第一个断点还是大于最后一个断点。外插方法将返回生成的线性曲面上与输入对应的点。

  • Cubic spline” - 对第一对或最后一对断点拟合一条三次样条曲线,具体取决于输入是小于第一个断点还是大于最后一个断点。此方法将返回该样条曲线上与输入对应的点。

 

舍入方法

如果某个输入在两个断点值之间或者超出断点数据集的范围,而您未指定内插或外插,则模块会将该值舍入到临近的断点,并返回对应的输出值。例如,Lookup Table Dynamic 模块允许您选择以下舍入方法之一:

  • Use Input Nearest” - 返回与最接近的输入值对应的输出值。

  • Use Input Below” - 返回与小于输入值的紧邻断点值对应的输出值。如果输入值下面没有任何断点值,则返回最接近输入值的断点值。

  • Use Input Above” - 返回与大于输入值的紧邻断点值对应的输出值。如果输入值上面没有任何断点值,则返回最接近输入值的断点值。

 

Index search method - 计算表索引的方法

有三种:等间距点、线性搜索、二分搜索。

选择 Evenly spaced pointsLinear search 或 Binary search。每一种搜索方法在不同的情况下均有各自的速度优势。

 

 

参考资料

逼近 N 维函数

1-D、2-D 和 n-D Lookup Table 模块计算一个函数的 N 变量采样表示形式

https://ww2.mathworks.cn/help/simulink/slref/ndlookuptable.html

 

估算缺失点的方法

内插方法、外插方法、舍入方法

https://ww2.mathworks.cn/help/simulink/ug/methods-for-estimating-missing-points.html

### 解决方案 当遇到 `1-D Lookup Table` 的 `BreakpointsForDimension1` 不严格单调递增错误时,可以采取以下方法来修正这个问题。确保数据点按照严格的升序排列是解决问题的关键。 #### 方法一:手动调整断点值 如果数据量较小,可以直接检查并修改数组中的元素,使其满足严格单调递增的要求: ```matlab % 假设原始的断点向量如下 breakpoints = [0, 1, 2, 2.5, 3]; % 手动调整重复或相等的元素 adjusted_breakpoints = [0, 1, 2, 2.6, 3]; ``` 这种方法简单直观,但对于较大的数据集可能不太实用[^1]。 #### 方法二:自动处理函数 对于较大规模的数据集,编写一个自动化脚本来修复此类问题是更高效的方式。下面是一个简单的 MATLAB 函数实现: ```matlab function adjusted_bp = fix_monotonic(bp) % 输入参数 bp 是待校正的一数组 tol = eps; % 定义一个小阈值用于浮点数比较 n = length(bp); adjusted_bp = zeros(1,n); adjusted_bp(1) = bp(1); for i=2:n if abs(bp(i)-bp(i-1)) <= tol || bp(i)<=bp(i-1) adjusted_bp(i)=adjusted_bp(i-1)+eps; else adjusted_bp(i)=bp(i); end end end ``` 此代码片段会遍历输入数组,并通过增加极小数值(如机器精度 `eps`)使相邻两个相同或逆序的元素变得有序[^2]。 #### 方法三:利用内置工具箱功能 MATLAB 提供了一些辅助工具可以帮助用户快速定位和纠正这类问题。例如,在 Simulink 中可以通过设置诊断选项来检测并警告潜在的非单调性问题。此外还可以考虑使用 `unique()` 或者其他预处理命令先清理掉冗余项后再构建查找表模型[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值