1

我需要解决的问题是转换二维查找表。

在此处输入图像描述

该表可以定义为一个数组

Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]

x1 = [0 20 ... 100]
x2 = [800 1200 ... 4800].

因此x1x2在排列中,y = f(x1,x2)由上表定义的任何一个都可以给出一个y值。

现在,我需要x1得到yx2。也就是说,给定 rpm 和y值,找出合适x1的 . 例如,800 rpm 和 97,给出 20% 的值。如果是 800 和 107,则返回 28.3%。

可以使用 Matlab 或 Python。

4

3 回答 3

3

在 Matlab 中:

我的另一个答案假设最常见的情况是 RPM 的值可以是 800 到 4800 范围内的任何值。但是,如果您确定您选择的值将是其中一行,则只需考虑那行:

Percent = [0 20 30 40 ... 90 100];
RPM = [800; 1200; 1400; ... 4400; 4800];
Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]
x2 = 800;
y = 107;

RPM_id = find(RPM == x2,1);
Table_row = Table(RPM_id,:);
x1 = interp1(Table_row,Percent,y)

这再次导致

x1 =
   28.3333
于 2019-05-08T16:24:16.790 回答
2

为避免多次构建插值,我建议使用griddedInterpolant所有插值构建一次,然后您可以随意查询。

请注意,您应该考虑插值,即您要使用哪种数值方案来计算不属于初始表的值(例如 OP 中的 (800;107) )。基本(和默认)方案是线性插值;使用您的表格(不统一),“makima”和“spline”之间可能存在高阶插值方案。有关所有这些的更多信息,请参阅文档。

构建插值的代码如下,假设整个表存储在变量中T

rpm = [800 1200 1400 1600:400:4800];
N = [0 20:10:100];
[g_rpm, g_N] = meshgrid(rpm, N);
G = griddedInterpolant(rpm, N ,T);

添加第四个参数以指定插值方案(例如'makima')。

然后,要找到所需的值,您可以构建自己的函数,如下所示:

F = @(r, t) fminsearch(@(x) abs(t-G(r,x)), 50);

50是先验起始值;T如果不是单调的,您必须对其进行细化。

在 OP 中的输入:

F(800, 97)给 20

F(800, 107)给出 28.333(线性插值,28.224 makima 插值和 26.898 样条插值)

增强

如果您想对计算进行矢量化,您可以通过将函数体包含在以下内容中来做到这F一点arrayfun

F = @(R,T) arrayfun(@(r,t) fminsearch(@(x) abs(t-G(r,x)), 25), R, T);

所以现在你可以像这样一次输入几个输入:

F([800 2000],[100 100])

ans =

       21.966       15.564
于 2019-05-09T12:38:19.130 回答
1

在 Matlab 中:

一般情况是 x2 值不是 RPM 向量的元素。如果确定是这样,您可以将下面的 2D 插值转换为 1D 插值。但是对于一般情况,您可以猜测 x1,将 (x1,x2) 插入到您的表中,看看结果值是否等于您的 y 值。

Percent = [0 20 30 40 ... 90 100];
RPM = [800; 1200; 1400; ... 4400; 4800];
Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]


x2 = 800;
y = 107;

% we square the difference since we want the error to be > 0
F = @(s) (interp2(Percent, RPM, Table,s,x2) - y).^2; 

x1 = fminbnd(@(x) F(x),0,100) 

这导致

x1 =
   28.3333

编辑:此解决方案的先前版本基于百分比的均匀分布值。没有 10% 的列,因此该示例的答案是错误的。解决方案已更新以反映正确的百分比。

于 2019-05-08T14:43:48.257 回答