(q / kdb +) Интерполяционная формула не работает в некоторых случаях - PullRequest
0 голосов
/ 26 октября 2018

У меня есть формулы ниже для генерации линейной интерполяции в 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 во втором ряду?

Обновление: Поведение Inconsistet для других примеров

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.

Как я могу это исправить?

Спасибо!

1 Ответ

0 голосов
/ 27 октября 2018

Причина, по которой вы столкнулись с этой проблемой, связана с математическим делением матрицы деталей.

Матричное деление может быть выполнено путем взятия обратной матрицы, а затем умножения матрицы. В 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 является строка 7.5 7.5. При значении z 1f этот вектор преобразуется в матрицу (1 1;7.5 7.5) в операции xexp. Эта матрица затем используется в операции lsq.

Проблема возникает тогда, когда (1 1;7.5 7.5) не является обратимым. Матрица обратима тогда и только тогда, когда определитель не равен нулю. Определитель для матрицы 2 x 2 равен AD - BC. В вашем примере A = 1, B = 1, C = 7.5 и D = 7.5. Таким образом, определитель равен нулю, матрица необратима, и выходной сигнал функции равен Onf.

Чтобы решить эту проблему, вы должны убедиться, что два элемента в каждом ряду x не идентичны.

Надеюсь, это поможет.

...