Страницы: 1 2 След.
RSS
Линейная интерполяция
 
Доброго времени суток!  
 
Нужно выполнить линейную интерполяцию/экстраполяцию данных. Для решения сей задачи, в связи с отсутствием готовой функции в Excel, написал функцию, которая отлично работала пока я в нее передавал данные типа double. Сейчас мне нужно использовать ее отдельно от основного макроса и нужно передавать в нее данные с листа (типа Variant). Вот здесь то я и споткнулся...  
 
Все подробности в файле.  
 
Если кто-нить знает как оптимизировать код макроса, подскажите, плз.
 
> в связи с отсутствием готовой функции в Excel  
 
Функция ЛИНЕЙН.
 
> нужно передавать в нее данные с листа  
 
См. аттач.  
 
=20004=
 
Спасибо за исправленные ошибки. )  
 
PS. Функция ЛИНЕЙН линейную интерполяцию не дает.
 
> Функция ЛИНЕЙН линейную интерполяцию не дает  
Да, она дает коэффициенты прямой, по которым из Х можно получить У.  
 
А вот функция ПРЕДСКАЗ делает именно то, что Ваша! Только порядок аргументов другой.
 
{quote}{login=Федор}{date=07.09.2010 04:46}{thema=}{post}PS. Функция ЛИНЕЙН линейную интерполяцию не дает.{/post}{/quote}  
 
Линейную интерполяцию можно найти с помощью функции ПРЕДСКАЗ (из этой же серии функции ТЕНДЕНЦИЯ, ЛИНЕЙН, НАКЛОН)
 
Аппроксимация и интерполяция – не одно и то же, они совпадают только, если заданы всего две точки. Интерполяция предполагает обязательное прохождение через все заданные точки, а к аппроксимации такое требование не предъявляется.  
 
В данном случае речь идет о кусочно-линейной интерполяция и экстраполяция данных. При этом экстраполяция осуществляется по уравнению прямой двух конечных точек: 1-й и 2-й при X <= Xmin, последней и предпоследней – для X >= Xmax  
 
Вот код, не зависящий от горизонтальности или вертикальности диапазонов RngX и RngY:  
 
Function Y(RngX As Range, RngY As Range, X As Double) As Double  
 
 Dim i&, xmin#, xmax#, x1#, x2#, y1#, y2#, v  
 
 i = RngX.Count  
 xmin = RngX(1)  
 xmax = RngX(i)  
 
 If X <= xmin Then  
   
   x1 = RngX(2)  
   x2 = xmin  
   y1 = RngY(2)  
   y2 = RngY(1)  
 
 ElseIf X >= xmax Then  
   
   x1 = RngX(i - 1)  
   x2 = xmax  
   y1 = RngY(i - 1)  
   y2 = RngY(i)  
 
 Else  
     
   i = 0  
   For Each v In RngX.Value  
     i = i + 1  
     If X < v Then Exit For  
   Next  
   x1 = RngX(i - 1)  
   x2 = v  
   y1 = RngY(i - 1)  
   y2 = RngY(i)  
 
 End If  
 
 Y = y1 + (X - x1) * (y2 - y1) / (x2 - x1)  
 
End Function  
 
 
Sub Test()  
 ' Аналогично формуле ячейки: =Y(C8:E8;C12:E12;I8)  
 Debug.Print Y(Range("C8:E8"), Range("C12:E12"), [I8])
End Sub
 
Ребята, у меня вот немного другая задача... Я работаю над некоторыми вычислениями в Excel и мне не хватает данных для точности. Я построила график по тем данным которые у меня есть. Получилась ломанная линия. Могу ли я получить дополнителные значения из графика на каждом отрезке, например 7-8 значений, и выводить их в отдельную таблицу? как можно это осуществить через VBA? Наверное тоже нужно использовать интерполяцию...
 
{quote}{login=Alice}{date=23.10.2011 04:28}{thema=}{post}Ребята, у меня вот немного другая задача...{/post}{/quote}  
Задача вполне та же, посмотрите приложенный файл.  
Первая диаграмма построена с шагом по X, равным 1, а вторая диаграмма построена по интерполированнам точкам с шагом по X, равным 0.2
 
Можно и без VBA через функцию ПРЕДСКАЗ.  
(на базе файла от ZVI)
 
Можно чуть улучшить предсказания значений в промежуточных точках с помощью нелинейной интерполяции:
 
Нелинейно интерполировать можно также с помощью формул, получилось немного не так, как у С.М., но близко
 
Подправил ЮДФ:
 
Спасибо всем большое!  Буду разбираться сейчас!:)
 
Доброго утра всем!    
Еще раз спасибо за помощь. Я сделала это по примеру MCH через стандартные функции, так как я пыталась сделать на примере ZVI, но я совсем запуталась в последовательности создания программы... Очень бы хотелось все-таки разобраться.. Правильно ли я делала? Сначала я создала макрос с названием функции (function). Потом в VBA editor прописываю эту функцию в теле функции sub function end function и все?    
У меня еще другая задача, помогите пожалуйста написать программу по вычислению среднего значения. В приложенном файле, нужно подсчитать среднее значение Whole porosity, Y, но чтобы просчитывало по значениям столбца Core top depth, X через определенное количество строк. То есть с 2881 до 2881.8, и выводило результат с следующем столбце напротив 2881. След. среднее значение с 2882 до 2882.8, то бишь среднее значение на каждом метре. Можно опять таки сделать это через стандартные функции, но мне нужно программно...
 
Не могли бы вы подкорректировать функцию  
 
Function Y(RngX As Range, RngY As Range, X As Double) As Double  
 
чтобы она корректно работала со значениями меньше 1 на оси Х?
 
{quote}{login=Максим}{date=08.12.2011 05:23}{thema=}{post}Не могли бы вы подкорректировать функцию...{/post}{/quote}  
Там все корректно работает и с отрицательными числами.  
Например, можно задать в A2 отрицательное значение X,  
а в A21 записать начальное интерполируемое значение X1, которое нас интересует.  
Не обязательно они должны совпадать. Но чтобы A21 всегда совпадало с A2 достаточно в A21 поместить формулу =A2.  
 
Приложил пример с отрицательными значениями X и X1, смотрите комментарий в ячейке A21
 
вот пример
 
залогиниться забыл.    
 
в примере при вводе х=0,5 должно выводиться 4, а выводится 2,5
 
вот ещё, заодно спрошу.  
 
тут один умный товарищ преобразовал указанные в примере значения Х и Y в, цитирую - "значения Y как функцию Х интерполировал полиномом 2-й степени", получив y = 1/(0,07596*х*х+0,3032*х+0,094). Функция работает правильно, но с очень уж большой погрешностью. есть ли способ с помощью экселя делать подобные функции и желательно с большей точностью.
 
{quote}{login=Максим}{date=09.12.2011 09:25}{thema=}{post}залогиниться забыл.    
 
в примере при вводе х=0,5 должно выводиться 4, а выводится 2,5{/post}{/quote}  
У Вас там значения X в диапазоне A18:A21 идут по убыванию.  
Отсортируйте по возрастанию и все будет нормально.
 
{quote}{login=Максим}{date=09.12.2011 09:37}{thema=}{post}вот ещё, заодно спрошу.  
 
тут один умный товарищ преобразовал указанные в примере значения Х и Y в, цитирую - "значения Y как функцию Х интерполировал полиномом 2-й степени", получив y = 1/(0,07596*х*х+0,3032*х+0,094). Функция работает правильно, но с очень уж большой погрешностью. есть ли способ с помощью экселя делать подобные функции и желательно с большей точностью.{/post}{/quote}  
Название темы - ЛИНЕЙНАЯ интерполяция.  
Для нелинейной интерполяции, само собой, нужна другая обработка, их существует множество разных.  
 
То, что Вы написали про полином 2-й степени - не интерполяция, а аппроксимация.  
Как правильно посчитать коэффициенты различных видов аппроксимации, смотрите здесь:  
http://www.planetaexcel.ru/forum.php?thread_id=14149
 
всё понял. спасибо огромное!
 
Спасибо за посевы Доброго и Разумного! Линейная интерполяция очень пользуемая в работе штука и иногда удобна средствами Excel, а иногда с VBA. Удачи всем Вам!
 
Добрый день!  
 
Я внимательно ознакомился с данной темой, но я не математик и некоторые термины мне понятны, но не очевидны. Есть неоктрые сомнения правильно ли я понимаю предмет.  
 
Мне необходимо решить следующую задачу:  
 
Имеется некоторая зависимость y = f(x)  
 
У   Х  
1   5  
3   7  
4   10  
10  1  
 
Мне необходимо формализовать данную зависимость таким образом, что бы я мог ввести любое значение Х, а мне возвращалось значение Y.  
 
Я понимаю, что это несколько уравнений прямых и могу получить коэффициенты каждой прямой. Но мне необходимо что бы в зависимости от значения Х менялось уравнение кривой. Как это сделать, я не смог разобраться.  
Надеюсь на вашу помощь.  
Будет это сделано с помощью макроса или ячеек для меня не имеет значения.
 
"Но мне необходимо что бы в зависимости от значения Х менялось уравнение кривой"  
Что за бред?  
Уточните у преподавателя еще раз.  
 
Думаю, Вам будет полезно:  
 http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1­%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BD%D­0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD_%D0%9B%D0%B0%D0%B3%­D1%80%D0%B0%D0%BD%D0%B6%D0%B0
 
subtlety, спасибо за поправку в формулировке. Значит, мне необходимо вывести интерполяционный многочлен Лагранжа средствами эксель.  
 
По поводу преподавателя. Я не студент, который решает курсовую. Я работаю в финансовой организации и решаю задачи, котрые сам перед собой ставлю. Не хотелось бы, что бы слово "предмет", сбивало вас с толку.
 
"средствами эксель".  
Точно? Есть много специализированных продуктов для этого.  
http://numericalmethods.eng.usf.edu/topics/lagrange_method.html  
[MAPLE] [MATHCAD] [MATHEMATICA] [MATLAB]
 
"котрые сам перед собой ставлю"  
пока что не очень получается.  
 
 http://www.cyberforum.ru/ms-excel/thread374771.html  
 http://pers.narod.ru/study/excel_lagrange.html
 
subtlety, спасибо огромное!  
 
Я тут воспользовался файлом по одной из ссылок и ввел туда необходимые мне соотношения.  
Но модель как бы "сбивается" и иногда выдает неправильные данные.  
Например, когда я ввожу цифру "8", то модель выдает не то значение, которое изначально предполагалось.  
 
Извиняюсь за кривую формулировку вопроса, но я специалист из другой области. Надеюсь на вашу благосклонность в решении вопроса.
 
Antuan, да нифига модель не сбивается - у Вас исходные данные кривые.  
Проверил ЮДФ-кой (см. файл).  
---------------------------  
Офф:  
http://forum.qwerty.ru/index.php?showtopic=175092
Страницы: 1 2 След.
Наверх