Если вы попытаетесь выполнить линейную интерполяцию в Matlab, она, по-видимому, использует интерполянт с координатной сеткой.
Обычно я ожидаю, что функция линейной интерполяции будет выглядеть примерно так:
СПОСОБ A:
Где мы хотим знать значение y(u) в u.
Тем не менее, Matlab использует следующие формулы:
СПОСОБ Б:
Таким образом, результат будет отличаться, если вы используете метод A и сравниваете ответ с методом B. Разница в результате, которую я обнаружил, составляет около 2 ^ -18 в арифметике с плавающей запятой двойной точности для определенных входных данных.
Мой вопрос:
Почему MATLAB выбирает метод B? Похоже, что метод А потребует меньше вычислений. Кроме того, является ли формула «более» правильной?
Выполнение метода А должно включать следующее:
темп = (у (к + 1) - у (к)) / (х (к + 1) - х (к))
y(u) = y1 + temp*(u-x(k))
2^{-18}
в отличии серьезно не о чем беспокоиться... это по сути 0. Вы можете вывести метод B из метода A, выполнив некоторые очень простые алгебраические манипуляции. Я также согласен с NKN по поводу временных вычислений. - person rayryeng   schedule 31.07.2015(5.0 / 3.0)
и выполнение5 * (1.0/3.0)
на самом деле даст вам небольшие ошибки с плавающей запятой между ними обоими. Если бы вы попробовали это, вы бы получили разницу почти вeps = 2.22e-16
. - person rayryeng   schedule 31.07.2015fma (fma (-t_u, y_k, y_k), t_u, y_k1)
. - person njuffa   schedule 31.07.2015y_k - y_k+1 << y_k
, мелкие ошибки будут усиливаться, так как вы вычитаете большие числа. Метод B также кажется более «симметричным» вy_k
иy_k+1
, что интуитивно кажется лучше (но он все еще асимметричен вx_k
иx_k+1
). Несколько связанных с Matlab вопросов здесь (обратите внимание на первый комментарий к принятому ответу) и здесь. - person Bas Swinckels   schedule 31.07.2015