首页 > 解决方案 > (q/kdb+) 插值公式在某些情况下不起作用

问题描述

我有以下公式可以在 q 中生成线性插值:

lsfit:{(enlist y) lsq x xexp/: til 1+z};
interp:{[xn;x;y]sum (1;xn)*flip lsfit[x;y;1]};

和下面的数据进行插值:

xn:(4.7;7.5;4.9);
x:(3 5f;7.5 7.5;3 5f);
y:(1.3 1.5;2 2f;1.3 1.5);
interp'[xn;x;y]

正在生成

index   value
0   enlist 1.47
1   enlist 0nf
2   enlist 1.49

为什么我要0排第二排?

更新:其他示例的不一致行为

xn:(6;7;8;9);
x:(6 6f;7 7f;8 8f;9 9f);
y:(1 1f;1 1f;1 1f;1 1f);
interp'[xn;x;y]

生成

index   value
0   enlist 1f
1   enlist 0nf
2   enlist 0nf
3   enlist 1f

因此,看起来有时公式有效,第 0 行和第 3 行,有时它不有效,第 1 行和第 2 行。

我该如何解决?

谢谢!

标签: kdb

解决方案


您遇到此问题的原因是数学细节矩阵除法。

矩阵除法可以通过取矩阵的逆然后矩阵相乘来执行。在 q 中,这可以通过直接执行这些操作来看到。

q) enlist[2 2f] lsq (1 2f;3 4f)
-1 1
q) enlist[2 2f] mmu inv (1 2f;3 4f)
-1 1

您的输入x值之一lsfit是 row 7.5 7.5。值为z1f,这会将向量转换为运算(1 1;7.5 7.5)中的矩阵xexp。然后在lsq操作中使用该矩阵。

然后会出现问题,因为(1 1;7.5 7.5)它是不可逆的。当且仅当行列式非零时,矩阵是可逆的。矩阵的2 x 2行列式是AD - BC。在您的示例中,A = 1B = 1C = 7.5D = 7.5。所以行列式为零,矩阵不可逆,函数的输出为Onf

要解决此问题,您必须确保每行中的两个项目x不相同。

希望有帮助。


推荐阅读