2

如果效果更好,我需要一些数学帮助,或者一些 excel 帮助。我有一组数据点,我需要计算中间数据。下表是已知数据点,我需要知道的是,如果我输入 1200 英尺,有什么 MEG 可用。

FOOTAGE MEG
1000    19.3
2000    20.66
3000    21.328
4000    21.398
5000    20.976
6000    20.155
7000    19.023
8000    17.658
9000    16.133
10,000  14.513
11,000  12.854
12,000  11.208
13,000  9.617
14,000  8.117
15,000  6.736
16,000  5.493
17,000  4.411
18,000  3.487
19,000  2.724
20,000  2.114

我已将这些输入到 excel 中,并着手寻找他们的图表认为可以回答我的问题的公式。他们给出的公式是

y = 8E-12x3 - 3E-07x2 + 0.0018x + 18.218

这实际上让我在 12k 英尺以下的任何地方都能获得非常好的结果。在那之后,结果越来越不准确,直到我在 18k 英尺后开始得到负数。

我尝试输入更多订单来计算,但这只会让事情变得更糟。

将图表分成 2 个(>10k 英尺和 <10k 英尺)并使用 2 个公式会更好,还是使用整个图表有一个好的解决方案?

4

2 回答 2

3

精度非常重要。事实上,你所做的事情有几个严重的问题。

仅仅使用一位精度的系数会导致严重的问题。请记住,x 与 20000 一样大。乘以该大小的数字将是一个巨大的数字。现在,将它乘以大约 8e-12 的数字,你会得到什么?

哦,顺便说一下,那些系数的实际值应该更接近

[8.38044124105504e-12  -2.95337111670131e-07  0.00176948515975282  18.2176584107327]

那么这有什么不同吗?

8e-12*20000^3
ans =
    64

8.38044124105504e-12*20000^3
ans =
         67.0435299284403

它确实有所作为,一个严重的。

您可能会选择使用简单的线性插值,但三次更平滑一些。小心外推,因为如果你尝试立方会做奇怪的事情。但事实上,三次多项式存在大量的失拟。只要您小心地将自变量(素材)除以 10000,就可以使用 4 阶多项式做得更好。

a4 =  -3.02325078929022
a3 =  21.0780945560741
a2 = -46.9692303618201
a1 =  26.3111163470058
a0 =  17.1162276831784

MEG = a0 + a1*footage/10000 + a2*(footage/10000)^2 +
          a3*(footage/10000)^3 + a4*(footage/10000)^4

请注意按 10000 缩放的重要性(或者至少选择一个数字来转换您的数字,使它们大约为 1 左右。)

尽管在增加适合的顺序方面,我并没有超越这一点。

于 2013-01-15T00:41:50.727 回答
0

我可以建议您使用一个小的 VBA 脚本,它使用线性插值从您的列表中提取一个值:

Public Function Linterp(Tbl As Range, x As Double) As Variant
     ' linear interpolator / extrapolator
     ' Tbl is a two-column range containing known x, known y, sorted x ascending

    Dim nRow As Long
    Dim iLo As Long, iHi As Long

    nRow = Tbl.Rows.Count
    If nRow < 2 Or Tbl.Columns.Count <> 2 Then
        Linterp = CVErr(xlErrValue)
        Exit Function '-------------------------------------------------------->
    End If

    If x < Tbl(1, 1) Then ' x < xmin, extrapolate from first two entries
        iLo = 1
        iHi = 2
    ElseIf x > Tbl(nRow, 1) Then ' x > xmax, extrapolate from last two entries
        iLo = nRow - 1
        iHi = nRow
    Else
        iLo = Application.Match(x, Application.Index(Tbl, 0, 1), 1)
        If Tbl(iLo, 1) = x Then ' x is exact from table
            Linterp = Tbl(iLo, 2)
            Exit Function '---------------------------------------------------->
        Else ' x is between tabulated values, interpolate
            iHi = iLo + 1
        End If
    End If

    Linterp = Tbl(iLo, 2) + (Tbl(iHi, 2) - Tbl(iLo, 2)) * (x - Tbl(iLo, 1)) / (Tbl(iHi, 1) - Tbl(iLo, 1))     
End Function

您可以使用以下内容从工作表中调用它:

=Linterp(A1:b10, 1200)

您可以轻松地调整代码以调整您希望如何处理超出范围的值。

稍有不同的是,您可能还对这个http://www.codecogs.com/excel_render感兴趣,它可以绘制出您的方程式。

于 2013-01-29T12:20:46.903 回答