{
  "version": 1,
  "id": "po.wb.numerics.spline-interpolation",
  "name": "Spline Interpolation — PVT Table Application",
  "sheets": [
    {
      "name": "Lab Data",
      "cells": [
        {
          "ref": "A1",
          "value": "PVT Lab Data — Oil Formation Volume Factor"
        },
        {
          "ref": "A2",
          "value": "Lab-measured Bo values at discrete pressures. Engineers need Bo at pressures between lab points (e.g., for reservoir simulation grid blocks). Spline interpolation provides smooth, continuous estimates."
        },
        {
          "ref": "A4",
          "value": "Lab Measurements"
        },
        {
          "ref": "A5",
          "value": "P (psi)"
        },
        {
          "ref": "B5",
          "value": "Bo (rb/STB)"
        },
        {
          "ref": "A6",
          "value": 500
        },
        {
          "ref": "B6",
          "value": 1.08
        },
        {
          "ref": "A7",
          "value": 1000
        },
        {
          "ref": "B7",
          "value": 1.14
        },
        {
          "ref": "A8",
          "value": 1500
        },
        {
          "ref": "B8",
          "value": 1.2
        },
        {
          "ref": "A9",
          "value": 2000
        },
        {
          "ref": "B9",
          "value": 1.27
        },
        {
          "ref": "A10",
          "value": 2500
        },
        {
          "ref": "B10",
          "value": 1.35
        },
        {
          "ref": "A11",
          "value": 3000
        },
        {
          "ref": "B11",
          "value": 1.44
        },
        {
          "ref": "A12",
          "value": 3500
        },
        {
          "ref": "B12",
          "value": 1.48
        },
        {
          "ref": "A14",
          "value": "These 7 lab points are the source data for interpolation on the next sheet. Cubic spline preserves curve shape between points; linear interpolation connects with straight segments."
        }
      ]
    },
    {
      "name": "Interpolation",
      "cells": [
        {
          "ref": "A1",
          "value": "Cubic vs Linear Interpolation of Bo"
        },
        {
          "ref": "A2",
          "value": "Interpolate Bo at 25 pressure points using both cubic and linear spline. The difference column shows where cubic interpolation matters most — at high curvature regions."
        },
        {
          "ref": "A4",
          "value": "Single Point Query"
        },
        {
          "ref": "A5",
          "value": "Query Pressure"
        },
        {
          "ref": "B5",
          "value": 1750
        },
        {
          "ref": "C5",
          "value": "psi"
        },
        {
          "ref": "A6",
          "value": "Bo (Cubic)"
        },
        {
          "ref": "B6",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,QueryP)",
          "cached": 1.2338942307692307
        },
        {
          "ref": "C6",
          "value": "rb/STB"
        },
        {
          "ref": "A7",
          "value": "Bo (Linear)"
        },
        {
          "ref": "B7",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,QueryP)",
          "cached": 1.2349999999999999
        },
        {
          "ref": "C7",
          "value": "rb/STB"
        },
        {
          "ref": "A8",
          "value": "Difference"
        },
        {
          "ref": "B8",
          "formula": "=$B$6-$B$7",
          "cached": -0.0011057692307692157
        },
        {
          "ref": "C8",
          "value": "rb/STB"
        },
        {
          "ref": "A10",
          "value": "Derivative (dBo/dP)"
        },
        {
          "ref": "A11",
          "value": "dBo/dP (Cubic)"
        },
        {
          "ref": "B11",
          "formula": "=PO.Spline.Cubic.Diff('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,QueryP)",
          "cached": 0.0001410897435897437
        },
        {
          "ref": "C11",
          "value": "rb/STB/psi"
        },
        {
          "ref": "A12",
          "value": "dBo/dP (Linear)"
        },
        {
          "ref": "B12",
          "formula": "=PO.Spline.Linear.Diff('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,QueryP)",
          "cached": 0.00014000000000000012
        },
        {
          "ref": "C12",
          "value": "rb/STB/psi"
        },
        {
          "ref": "A14",
          "value": "Full Interpolation Table"
        },
        {
          "ref": "A15",
          "value": "P (psi)"
        },
        {
          "ref": "B15",
          "value": "Bo Cubic"
        },
        {
          "ref": "C15",
          "value": "Bo Linear"
        },
        {
          "ref": "D15",
          "value": "Difference"
        },
        {
          "ref": "A16",
          "value": 500
        },
        {
          "ref": "B16",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A16)",
          "cached": 1.08
        },
        {
          "ref": "C16",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A16)",
          "cached": 1.08
        },
        {
          "ref": "D16",
          "formula": "=B16-C16",
          "cached": 0
        },
        {
          "ref": "A17",
          "value": 600
        },
        {
          "ref": "B17",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A17)",
          "cached": 1.092123076923077
        },
        {
          "ref": "C17",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A17)",
          "cached": 1.092
        },
        {
          "ref": "D17",
          "formula": "=B17-C17",
          "cached": 0.00012307692307689244
        },
        {
          "ref": "A18",
          "value": 700
        },
        {
          "ref": "B18",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A18)",
          "cached": 1.1042153846153846
        },
        {
          "ref": "C18",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A18)",
          "cached": 1.104
        },
        {
          "ref": "D18",
          "formula": "=B18-C18",
          "cached": 0.00021538461538450626
        },
        {
          "ref": "A19",
          "value": 800
        },
        {
          "ref": "B19",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A19)",
          "cached": 1.1162461538461539
        },
        {
          "ref": "C19",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A19)",
          "cached": 1.1159999999999999
        },
        {
          "ref": "D19",
          "formula": "=B19-C19",
          "cached": 0.00024615384615400693
        },
        {
          "ref": "A20",
          "value": 900
        },
        {
          "ref": "B20",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A20)",
          "cached": 1.1281846153846153
        },
        {
          "ref": "C20",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A20)",
          "cached": 1.128
        },
        {
          "ref": "D20",
          "formula": "=B20-C20",
          "cached": 0.00018461538461544968
        },
        {
          "ref": "A21",
          "value": 1000
        },
        {
          "ref": "B21",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A21)",
          "cached": 1.14
        },
        {
          "ref": "C21",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A21)",
          "cached": 1.14
        },
        {
          "ref": "D21",
          "formula": "=B21-C21",
          "cached": 0
        },
        {
          "ref": "A22",
          "value": 1100
        },
        {
          "ref": "B22",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A22)",
          "cached": 1.1516923076923076
        },
        {
          "ref": "C22",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A22)",
          "cached": 1.152
        },
        {
          "ref": "D22",
          "formula": "=B22-C22",
          "cached": -0.0003076923076923421
        },
        {
          "ref": "A23",
          "value": 1200
        },
        {
          "ref": "B23",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A23)",
          "cached": 1.1633846153846152
        },
        {
          "ref": "C23",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A23)",
          "cached": 1.164
        },
        {
          "ref": "D23",
          "formula": "=B23-C23",
          "cached": -0.0006153846153846843
        },
        {
          "ref": "A24",
          "value": 1300
        },
        {
          "ref": "B24",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A24)",
          "cached": 1.175230769230769
        },
        {
          "ref": "C24",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A24)",
          "cached": 1.176
        },
        {
          "ref": "D24",
          "formula": "=B24-C24",
          "cached": -0.0007692307692308553
        },
        {
          "ref": "A25",
          "value": 1400
        },
        {
          "ref": "B25",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A25)",
          "cached": 1.1873846153846153
        },
        {
          "ref": "C25",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A25)",
          "cached": 1.188
        },
        {
          "ref": "D25",
          "formula": "=B25-C25",
          "cached": -0.0006153846153846843
        },
        {
          "ref": "A26",
          "value": 1500
        },
        {
          "ref": "B26",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A26)",
          "cached": 1.2
        },
        {
          "ref": "C26",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A26)",
          "cached": 1.2
        },
        {
          "ref": "D26",
          "formula": "=B26-C26",
          "cached": 0
        },
        {
          "ref": "A27",
          "value": 1600
        },
        {
          "ref": "B27",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A27)",
          "cached": 1.2131876923076923
        },
        {
          "ref": "C27",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A27)",
          "cached": 1.214
        },
        {
          "ref": "D27",
          "formula": "=B27-C27",
          "cached": -0.0008123076923076678
        },
        {
          "ref": "A28",
          "value": 1700
        },
        {
          "ref": "B28",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A28)",
          "cached": 1.2268861538461537
        },
        {
          "ref": "C28",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A28)",
          "cached": 1.228
        },
        {
          "ref": "D28",
          "formula": "=B28-C28",
          "cached": -0.001113846153846243
        },
        {
          "ref": "A29",
          "value": 1800
        },
        {
          "ref": "B29",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A29)",
          "cached": 1.2409907692307691
        },
        {
          "ref": "C29",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A29)",
          "cached": 1.242
        },
        {
          "ref": "D29",
          "formula": "=B29-C29",
          "cached": -0.0010092307692308733
        },
        {
          "ref": "A30",
          "value": 1900
        },
        {
          "ref": "B30",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A30)",
          "cached": 1.255396923076923
        },
        {
          "ref": "C30",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A30)",
          "cached": 1.256
        },
        {
          "ref": "D30",
          "formula": "=B30-C30",
          "cached": -0.0006030769230769284
        },
        {
          "ref": "A31",
          "value": 2000
        },
        {
          "ref": "B31",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A31)",
          "cached": 1.27
        },
        {
          "ref": "C31",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A31)",
          "cached": 1.27
        },
        {
          "ref": "D31",
          "formula": "=B31-C31",
          "cached": 0
        },
        {
          "ref": "A32",
          "value": 2200
        },
        {
          "ref": "B32",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A32)",
          "cached": 1.2998707692307694
        },
        {
          "ref": "C32",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A32)",
          "cached": 1.302
        },
        {
          "ref": "D32",
          "formula": "=B32-C32",
          "cached": -0.002129230769230661
        },
        {
          "ref": "A33",
          "value": 2400
        },
        {
          "ref": "B33",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A33)",
          "cached": 1.3322276923076923
        },
        {
          "ref": "C33",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A33)",
          "cached": 1.334
        },
        {
          "ref": "D33",
          "formula": "=B33-C33",
          "cached": -0.0017723076923077397
        },
        {
          "ref": "A34",
          "value": 2600
        },
        {
          "ref": "B34",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A34)",
          "cached": 1.3689846153846155
        },
        {
          "ref": "C34",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A34)",
          "cached": 1.368
        },
        {
          "ref": "D34",
          "formula": "=B34-C34",
          "cached": 0.0009846153846153616
        },
        {
          "ref": "A35",
          "value": 2800
        },
        {
          "ref": "B35",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A35)",
          "cached": 1.4073846153846155
        },
        {
          "ref": "C35",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A35)",
          "cached": 1.404
        },
        {
          "ref": "D35",
          "formula": "=B35-C35",
          "cached": 0.0033846153846155413
        },
        {
          "ref": "A36",
          "value": 3000
        },
        {
          "ref": "B36",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A36)",
          "cached": 1.44
        },
        {
          "ref": "C36",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A36)",
          "cached": 1.44
        },
        {
          "ref": "D36",
          "formula": "=B36-C36",
          "cached": 0
        },
        {
          "ref": "A37",
          "value": 3100
        },
        {
          "ref": "B37",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A37)",
          "cached": 1.4520246153846152
        },
        {
          "ref": "C37",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A37)",
          "cached": 1.448
        },
        {
          "ref": "D37",
          "formula": "=B37-C37",
          "cached": 0.004024615384615293
        },
        {
          "ref": "A38",
          "value": 3200
        },
        {
          "ref": "B38",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A38)",
          "cached": 1.4613661538461538
        },
        {
          "ref": "C38",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A38)",
          "cached": 1.456
        },
        {
          "ref": "D38",
          "formula": "=B38-C38",
          "cached": 0.005366153846153798
        },
        {
          "ref": "A39",
          "value": 3300
        },
        {
          "ref": "B39",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A39)",
          "cached": 1.4686953846153845
        },
        {
          "ref": "C39",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A39)",
          "cached": 1.464
        },
        {
          "ref": "D39",
          "formula": "=B39-C39",
          "cached": 0.004695384615384546
        },
        {
          "ref": "A40",
          "value": 3400
        },
        {
          "ref": "B40",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A40)",
          "cached": 1.474683076923077
        },
        {
          "ref": "C40",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A40)",
          "cached": 1.472
        },
        {
          "ref": "D40",
          "formula": "=B40-C40",
          "cached": 0.00268307692307701
        },
        {
          "ref": "A41",
          "value": 3500
        },
        {
          "ref": "B41",
          "formula": "=PO.Spline.Cubic.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A41)",
          "cached": 1.48
        },
        {
          "ref": "C41",
          "formula": "=PO.Spline.Linear.Interp('Lab Data'!$A$6:$A$12,'Lab Data'!$B$6:$B$12,A41)",
          "cached": 1.48
        },
        {
          "ref": "D41",
          "formula": "=B41-C41",
          "cached": 0
        }
      ]
    }
  ],
  "namedRanges": [
    {
      "name": "QueryP",
      "refersTo": "Interpolation!$B$5"
    }
  ],
  "namedLambdas": [],
  "charts": [
    {
      "sheet": "Interpolation",
      "type": "XYScatterLines",
      "title": "Bo Interpolation — Cubic vs Linear",
      "series": [
        {
          "name": "Cubic",
          "values": "Interpolation!$B$16:$B$41",
          "categories": "Interpolation!$A$16:$A$41"
        },
        {
          "name": "Linear",
          "values": "Interpolation!$C$16:$C$41",
          "categories": "Interpolation!$A$16:$A$41"
        }
      ],
      "anchor": "A43",
      "endAnchor": "F61",
      "xAxis": {
        "title": "Pressure (psi)"
      },
      "yAxis": {
        "title": "Bo (rb/STB)"
      }
    }
  ],
  "shapes": [],
  "pictures": [],
  "connectors": [],
  "conditionalFormats": [],
  "sparklineGroups": [],
  "functions": [
    "PO.Spline.Cubic.Diff",
    "PO.Spline.Cubic.Interp",
    "PO.Spline.Linear.Diff",
    "PO.Spline.Linear.Interp"
  ]
}