Двойная интерполяция для большого набора данных в Excel [закрыто]


1

Как вы делаете двойную интерполяцию для большого набора данных в Excel?

Пользователь должен ввести значение x и значение y, после чего программа должна найти точки и, если необходимо, выполнить интерполяцию. Например, если x равен 3,5, а значение y равно 4,5, тогда у меня будет 2 значения x и 2 значения y, поэтому мне нужно выполнить двойную интерполяцию, а затем окончательную интерполяцию между оставшимися значениями.

Я использовал функцию vlookup и функцию прогноза, но она, похоже, не работает. Я приложил картину набора данных.

введите описание изображения здесь


Делайте это поэтапно, интерполируйте для значений x - как только это будет завершено, тогда выполните y .... и да, вы можете сделать это, но это становится сложным, так что это хорошая практика ...
Solar Mike

Когда вы используете vlookup, заставьте его возвращать значения по обе стороны от цели и т. Д. Я использовал его для значений плотности воздуха, поскольку они меняются в зависимости от давления и температуры, для оценки производительности двигателя.
Солнечный Майк

2
Серьезно - дамп Excel и использовать реальный инструмент. R, python, Matlab, Mathematica, Macsyma и т. Д. Встроенные 2-мерные подгонки.
Карл Виттхофт

Я думаю, что это удивительно, но это инженерия.
Петр

Ваш скриншот не читается. Если вы можете предоставить подмножество своего набора данных и немного лучше объяснить свой алгоритм интерполяции, то я уверен, что функция VBA должна быть в состоянии выполнить то, что вам нужно.
Транзистор

Ответы:


2

Похоже, что ваш набор данных имеет целочисленные значения заголовка строки и столбца, начиная с 0. Вы можете попробовать следующий код.

  • Включите ленту разработчика в Excel, если она еще не включена.
  • Нажмите кнопку Visual Basic .
  • Вставить | Модуль.
  • Вставьте приведенный ниже код в модуль.
  • Отрегулируйте значение rowOffset в соответствии с.
  • Введите формулу = Interpol2D (y, x) в вашу электронную таблицу, где вы хотите отобразить результат интерполяции.
  • Сохранить как .xlsm (с макросом).
  • Каждый раз, когда вы изменяете одно из указанных значений, расчет будет выполняться снова.
  • Вы можете отслеживать рассчитанные значения в окне Visual Basic Immediate .

Код:

Function Interpol2D(r, c)           'Row and column.
'By Transistor.
'https://engineering.stackexchange.com/questions/21400/double-interpolation-for-a-large-set-of-data-in-excel/21414#21414

    rowOffset = 10                  'The row number for the header line of the table.
    r1 = Int(r + rowOffset)         'The table row number for the first parameter
    r2 = Int(r) + rowOffset + 1     'The next row.
    c1 = Int(c) + 2                 'The table column number for the second parameter
    c2 = Int(c) + 3                 'The next column.

    'Layout of the four adjacent cells and the interpolated result.
    '    (r1, c1) *---p-------* (r1, c2)
    '                 |
    '                 |
    '                 r (result)
    '                 |
    '    (r2, c1) *---q-------* (r2, c2)

    r1c1 = ActiveSheet.Cells(r1, c1)
    r2c1 = ActiveSheet.Cells(r2, c1)
    r1c2 = ActiveSheet.Cells(r1, c2)
    r2c2 = ActiveSheet.Cells(r2, c2)

    'Interpolate by multiplying the difference between the two cells by the fractional
    'part of the parameter and then add in the first cell value.
    p = (r1c2 - r1c1) * (c - Int(c)) + r1c1    'The interpolation along the first horizontal.
    q = (r2c2 - r2c1) * (c - Int(c)) + r2c1    'The interpolation along the second horizontal.
    r = (q - p) * (r - Int(r)) + p             'The interpolation along the vertical.

    'Results will be printed out in the Immediate window.        
    Debug.Print "r1c1:", r1c1, p, r1c2, ":r1c2"
    Debug.Print "r: ", , r
    Debug.Print "r2c1:", r2c1, q, r2c2, ":r2c2"
    Debug.Print "================================================================================"

    Interpol2D = r                          'Return the result.

End Function

введите описание изображения здесь

Рисунок 1. Тестовые данные.

* Таблица 1. Результат окна отладки.

r1c1:          12            15            18           :r1c2
r:                           16.5 
r2c1:          14            17.5          21           :r2c2
================================================================================

Это лучший ответ, чем мой (написанный до того, как вопрос был действительно ясен!), И должен быть помечен как правильный.
Джонатан Р Свифт

Это неуместный комментарий, но мне нравится этот ответ, и я планирую целую вечность изучать vba. Я попробую это точно.
Катарина

Спасибо, @Katarina. Многие люди пишут ужасно сложные формулы Excel, которые трудно читать и отлаживать. Очень часто быстрый VB-код может очень легко решить проблему. Я попытался прокомментировать это довольно хорошо, чтобы читатель мог понять, как это работает. Я надеюсь, что вы найдете это полезным.
Транзистор

1

У меня есть таблица, которую я написал много лет назад для интерполяции. Он генерирует точки, которые следуют тому же виду профиля, что и функция «сглаженная линия», когда вы добавляете линию к диаграмме рассеяния X / Y.

На изображении ниже известные данные вводятся слева, а значения тренда рассчитываются, чтобы дать представление о градиенте на внешних границах данных. Желаемые значения X заносятся в правую таблицу, а значения Y рассчитываются соответственно.

На графике большие оранжевые капли - это исходные «известные данные», оранжевая линия - это «сглаженная линия», сгенерированная графическими функциями Excel, а синие точки - это интерполированные значения X / Y.

Скриншот таблицы

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

Формула для блоков «тренд» проста. Для ячейки D5, как показано, это:

=TREND(D6:D7,,0)

Формулы для полей «Interoplated» не так просты. Для ячейки I5, как показано, это:

=SUM((1+1/IRR(MMULT({0,0,2,0;0,1,0,-1;-1,4,-5,2;1,-3,3,-1},INDEX(D$5:D$13,MATCH(H5,D$5:D$13)+N(IF(1,{-1;0;1;2})))-H5
 )))^-{0;1;2;3}*MMULT({0,2,0,0;-1,0,1,0;2,-5,4,-1;-1,3,-3,1},INDEX(E$5:E$13,MATCH(H5,D$5:D$13)+N(IF(1,{-1;0;1;2})))))/2

Если вы воссоздаете электронную таблицу в точности так, как показано на рисунке, и обратите внимание на то, как формулы связывают диапазоны, вы сможете понять, как ее расширить для любого размера набора данных.


Я добавил немного больше информации к своему вопросу, будут ли предоставленные вами коды такими же, как для интерполяции, которую я должен выполнить в этом наборе данных?
Селетия Сахадаве
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.