次の表のx、yデータに基づいてルックアップと補間を実行したいと思います。考えられるエラーの量を減らすために、式をできるだけ単純にしてください。テーブル全体は、約50行x 30列です。私はそれらのテーブルを約20個持っています。これは、1つの抜粋です。
A B C D
1 0.1 0.2 0.3
2 2.4 450 300 50
3 2.3 500 375 52
4 2.1 550 475 55
5 1.8 600 600 60
たとえば、方程式はx = 2.27およびy = 0.15の値を見つける必要があります
各テーブルの最初の行と最初の列にインデックス値があり、テーブルの内部に一連の値がある複数のテーブルがあり、それぞれが特定の行と列のインデックス値に関連付けられています。
行または列のインデックスと正確に等しい、または2つの行のインデックス値または2つの列のインデックス値の間にある2つの値が与えられた場合、指定された2つの値に基づいてテーブルの値を直線補間します。最初の行と最初の列の値。
テーブルのインデックス値の間にある入力値の補間を行うには、以下が必要です。
垂直入力値vnum
より大きい(または等しい)最小の垂直インデックス値の行番号。テーブルの列1のインデックス値は降順であるため、これは次のようにして取得できます。
=MATCH(vnum,vrng,-1)
ここで、vnum
は入力値で、vrng
はテーブルの最初の列のインデックスの垂直範囲です。 MATCH
関数の-3番目の引数-1は、「より小」のルックアップが実行されることを示します。 MATCH関数をこのように使用するには、インデックスの垂直範囲が降順になっている必要があります。
垂直入力値(vnum
)より小さい(または等しい)最大の垂直インデックス値。垂直インデックス値はMATCH
で必要な昇順で並べ替えられていないため、MATCH
関数を使用して取得することはできません。代わりに、次の配列数式が使用されます。
=MIN(IFERROR(1/(vnum>=vrng)*ROW(INDIRECT("1:"&ROWS(vrng))),ROWS(vrng)))
この式の重要な要素はvnum>=vrng
は、最初のTRUE
が、入力値よりも小さい最大の垂直インデックス値を保持する行位置にあるブール配列を生成します。 ( "> ="の使用は直観に反するように見えるかもしれません。列のインデックスが降順であるため必要です。式の残りの部分は、この行の位置を行番号に変換します。
これらの2つの上下の行番号は、入力値の上下を囲むインデックス値と、それらのインデックス値に対応する内部テーブル値の両方を計算するために使用されます。
水平インデックス範囲の対応する列番号と列値は、同様の方法で作成されます。
残りのステップは、補間の計算を通して機能します。
このように多くのステップがあるため、複数の入力値の補間された量を計算することは実際的ではないように思えるかもしれません。双方向データ(what-if)テーブルを使用すると、実際には非常に簡単です。
複数のテーブルに対するこれらの計算の設定は、それらの1つの式のバージョンを使用することにより、さらに簡略化できます。これを使用するには、名前付き範囲vnum
、hnum
、vrng
、hrng
、datarng
、validvnum
、 validhnum
を設定する必要があります。テーブルは別のシートまたは別のブックにある必要があります。別のシートにある場合、各シートの名前はワークシートのスコープを持つように設定する必要があります。
次に、シングルステップの計算式がデータテーブルの左上のセルに入力されます。この2,100(マイナス1)文字の数式は、ダウンロード可能なワークシートに含まれています。
この一連の計算を含むワークシートは、 このリンク を使用してダウンロードできます。
実際には、3次元のテーブルがあります。x
とy
は独立変数であり、検索する必要があるのはz
です。
2次元テーブルの解決策は知っていますが、3次元テーブルの場合も同様です。
したがって、2次元の表がある場合、Excelの「傾向線」機能を使用して、データに最適な数式を見つけることができます。その式を使用して、y
のx
を計算できます
x
を目的のx値に置き換えます以下のスクリーンショットでは、A12:A16はx
を保持し、B12:B16はy
を保持し、C12はy
のx
を計算する式を含みます。
あなたの場合(3次元データ)については、Excelにも3次元グラフを作成する機能がありますが、3次元傾向があるかどうかはわかりません。
Excelのインデックス機能と一致機能を組み合わせて使用すると、結果を得ることができます。上記のデータを使用すると、Excelに正確に配置され、次の式が導出されます。セルD8に数式が入力されます。
=INDEX($B$3:$D$6,MATCH(E2,$A$3:$A$6,-1),MATCH(F2,$B$2:$D$2,-1))
ここで見つけることができるバイリニア補間のVBAコードを作成しました: https://github.com/DanGolding/Linear-and-bilinear-interpolation-in-Excel
この方法の利点は、この画像に示すように、値のグリッドを簡単に補間できる単一の関数であることです(セルは値に応じて色付けされ、補間の効果を視覚化します)。
これが探している式です:2つの点(x1、y1)と(x2、y2)が与えられ、それらの間を補間するには、次の式を使用します。
y =(y2-y1)/(x2-x1)*(x-x1)+ y1
ここで、xは入力、yは出力です。次の場合 table
式は次のとおりです。= IF(ISERROR(MATCH(O3、R $ 4:R $ 10))、S $ 4、IF(ISERROR(INDEX(R $ 4:R $ 10、MATCH(O $ 3、R $ 4:R $ 10)+1) )、S $ 10、(INDEX(R $ 4:S $ 10、MATCH(O3、R $ 10)+1,2)-INDEX(R $ 4:S $ 10、MATCH(O3、R $ 4:R $ 10)、2 ))/(INDEX(R $ 4:S $ 10、MATCH(O3、R $ 4:R $ 10)+1,1)-INDEX(R $ 4:S $ 10、MATCH(O3、R $ 4:R $ 10)、1)) *(O3-INDEX(R $ 4:S $ 10、MATCH(O3、R $ 4:R $ 10)、1))+ INDEX(R $ 4:S $ 10、MATCH(O3、R $ 4:R $ 10)、2)))
Iferror関数はエンドポイントを処理します。外挿ではなく、値を終点に保持します。
この問題に対するこれまでの最良の答えはこのビデオにあります https://www.youtube.com/watch?v=LFUd5qF8nyE
最終的な式は
=FORECAST(C3,OFFSET(interpol_array,MATCH($C3,lookup_array,1)-1,0,2),OFFSET(lookup_array,MATCH($C3,lookup_array,1)-1,0,2))
ここで、「interpol_array」は値を補間する列として定義され、「lookup_array」は値を検索する列です。
この回答も同じことを述べています https://stackoverflow.com/questions/42877228/vlookup-and-interpolating
これは、3つの機能を組み合わせて解決されます。予測、オフセット、および一致。
=FORECAST($B$9,OFFSET(B3:D3,0,MATCH($B$9,$B$2:$D$2,1)-1,1,2),OFFSET($B$2:$D$2,0,MATCH($B$9,$B$2:$D$2,1)-1,1,2))
=FORECAST(B10,OFFSET(E3:E6,MATCH(B10,A3:A6,-1)-1,0,2),OFFSET(A3:A6,MATCH(B10,A3:A6,-1)-1,0,2))