Страницы: 1
RSS
Ошибка в интерполяции VBA
 
Здравствуйте!

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

Сделал под себя и обнаружил, что дальше 3 значения расчет ведется неверный. Формула интерполяции верная. Проверил на бумаге и подсчитал при 1.3, получил -0.1761, написал ход расчета в функцию, получил -0.1684. Подскажите, где ошибка в трех соснах?

Вот мой код
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function interpol_one()
   Dim r, g, r2 As Single
    
   r = Array(1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3)
   g = Array(-0.125, -0.139, -0.153, -0.174, -0.195, -0.219, -0.245, -0.274, -0.305, -0.339, -0.375, -0.455, -0.545, _
   -0.645, -0.755, -0.875)
   r2 = 1.31
 
    
   interpol_one = LinearInterpolation(r2, r(i), g(i), r(i + 1), g(i + 1))
     
End Function
  
Function LinearInterpolation(ByVal x As Double, ByVal x1 As Double, ByVal fx1 As Double, _
                                    ByVal x2 As Double, ByVal fx2 As Double) As Double
    If (x2 - x1) <> 0 Then LinearInterpolation = fx1 + (fx2 - fx1) * (x - x1) / (x2 - x1)
End Function
 
а так не проще?
Код
1
2
3
4
5
6
7
8
9
Option Base 1
 Function LinearInterpolation(i As Long) As Double
Dim r, g, x As Single
 r = Array(1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3)
 g = Array(-0.125, -0.139, -0.153, -0.174, -0.195, -0.219, -0.245, -0.274, -0.305, -0.339, -0.375, -0.455, -0.545, -0.645, -0.755, -0.875)
 x = 1.31
 If i > UBound(r) Or i > UBound(g) Then Exit Function
 If (r(i + 1) - r(i)) <> 0 Then LinearInterpolation = g(i) + (g(i + 1) - g(i)) * (x - r(i)) / (r(i + 1) - r(i))
End Function

вопрос, где i?
и самое главное
все это делается на листе и формулами листа
 
i я добавил от себя. В оригинале в строке (r2, r(i), g(i), r(i + 1), g(i + 1)) были (r2, r(0), g(0), r(1), g(1)). Я заметил, что если поменять эти 0 и 1 на, скажем, 12 и 13, то значения будут другие. Было предположение, что ошибка в этом, потому заменил на i? чтобы не было привязки к определенному числу.

То что делается на листе с формулами мне известно. Именно там реализован расчет. Суть его следующая:
Планируется построить здание с размерами сторон B и L. Внутри здания размещаются комнаты, как ячейки, со сторонами b и l. Размеры сторон этих ячеек кратны размерам сторон здания (не может размещаться половина комнаты или какая то часть, только целая). Но, вариаций размеров сторон ячеек может быть великое множество. Например, для здания размером 100×120м могут быть ячейки 1х1, 1х2, 1х4, 1х5....20х30, ...50х60 и так далее.

Какие стороны получаются кратными для данных длин здания  решается на листе и получаются строка значений l и столбец значений b. Внутри этого диапазона программа ищет массу здания. Получается табличка из масс для каждой длины и ширины комнаты. То есть расчет идет перебором по всем значениям и по этому он записан в функцию, где исходные данные только длина и ширина комнаты, а итог - масса здания. И в эту функцию мне нужно вставить интерполяцию, потому и не делаю её на листе.
Страницы: 1
Читают тему
Loading...