Home > Software design >  How to Mimic Curve stretched over longer term
How to Mimic Curve stretched over longer term

Time:03-08

I am trying to find a way to mimic the curve or a product release schedule.

enter image description here

This is the release schedule for the number of units for a product. We have a new product coming out that will have the same release schedule in a curve. that should look like this:

enter image description here

I want it to have the same curve but stretched over a longer period of time:

enter image description here

I tried to just break it down by the phase but the results didn't match the same curve:

enter image description here

enter image description here

I have access to excel, VBA, and R. Is there a way that I can get a calculation that would allow me to match the curve structure if I have a different length of time and possibly a different total amount of units? I know I'm supposed to show what I have tried as well but nothing has gotten me even close.

CodePudding user response:

You can get your NewData with Interpolation:

'Year  ....  0 - 25  
'x     ....  =year/25*17  
'Units ....  =Linterp($A$2:$B$19; x)   ---  A2:B19 is your input

Function Linterp(ByRef Tbl As Range, ByRef dX As Double) As Variant
 ' copied from
 ' https://www.ozgrid.com/forum/index.php?thread/82496-interpolate-an-array-of-numbers/
 '
 ' shg 06 Jun 1997
 ' Linear interpolator / extrapolator
 ' Tbl is a two-column range containing known x, known y, sorted ascending
 
    Dim i As Long ' index to Tbl
    Dim nRow As Long ' rows in Tbl
    Dim dXAbv As Double ' Tbl value above dX
    Dim dXBlo As Double ' Tbl values below dX
    Dim dRF As Double ' row fraction
    nRow = Tbl.Rows.Count
    
    If nRow < 2 Or Tbl.Columns.Count <> 2 Then
        Linterp = "Table must have >= 2 rows, exactly two columns"
        Exit Function '-------------------------------------------------------->
    End If
    If dX < Tbl(1, 1).Value Then ' dX < xmin, extrapolate first two entries
        i = 1
    Else
        i = WorksheetFunction.Match(dX, WorksheetFunction.Index(Tbl, 0, 1), 1)
        If dX = Tbl(i, 1).Value Then ' dX is exact from table
        Linterp = Tbl(i, 2)
        Exit Function '---------------------------------------------------->
        ElseIf i = nRow Then ' dX > xmax, extrapolate last two entries
            i = nRow - 1
            'Else
            ' dX lies between two rows, so interpolate entries i, i 1
            ' which is what happens by default
        End If
    End If
    dXAbv = Tbl(i, 1).Value
    dXBlo = Tbl(i   1, 1).Value
    dRF = (dX - dXAbv) / (dXBlo - dXAbv) ' row fraction
    Linterp = Tbl(i, 2).Value * (1 - dRF)   Tbl(i   1, 2).Value * dRF
End Function

enter image description here

Your input data is in A2:B19!
The new data is columns D, E and F!

D1: Year
D2: 0
D3: 1
...

E1: x
E2: =D2/25*17
E3: =D3/25*17
...

F1: Units
F2: =Linterp($A$2:$B$19;E2)
F3: =Linterp($A$2:$B$19;E3)
...

  • Related