Je voudrais faire une recherche et une interpolation basée sur les données x, y pour le tableau suivant. Je voudrais que l'équation soit aussi simple que possible pour réduire le nombre d'erreurs possibles. Le tableau complet contient environ 50 lignes x 30 colonnes. J'ai environ 20 de ces tables. Voici un extrait d'un:
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
Par exemple, l’équation doit trouver la valeur pour x = 2,27 et y = 0,15
Vous avez un certain nombre de tables qui ont des valeurs d'index dans la première ligne et la première colonne de chaque table et un ensemble de valeurs à l'intérieur de la table, chacune étant associée à des valeurs d'index de ligne et de colonne spécifiques.
Étant donné que deux valeurs, respectivement, peuvent correspondre exactement à un index de ligne ou de colonne, ou peuvent se situer entre deux valeurs d'index de ligne ou deux valeurs d'index de colonne, vous souhaitez effectuer une interpolation linéaire des valeurs de la table en fonction des deux données données. valeurs pour la première ligne et la première colonne.
Pour effectuer l'interpolation des valeurs d'entrée situées entre les valeurs d'index du tableau, vous devez disposer des éléments suivants:
Numéro de ligne de la plus petite valeur d'index vertical supérieure ou égale à la valeur d'entrée verticale vnum
. Les valeurs d'index de la colonne 1 du tableau étant par ordre décroissant, vous pouvez les obtenir avec:
=MATCH(vnum,vrng,-1)
où vnum
est la valeur en entrée et vrng
est la plage verticale des index dans la première colonne de la table. Le troisième argument -1 de la fonctionMATCH
indique qu'une recherche "inférieure à" sera effectuée. Cette utilisation de la fonction MATCH nécessite que la plage d'index verticale soit dans l'ordre décroissant.
La plus grande valeur d'index vertical inférieure ou égale à la valeur d'entrée verticale (vnum
). Cela ne peut pas être obtenu à l'aide de la fonction MATCH
car les valeurs d'index vertical ne sont pas triées dans l'ordre croissant requis par MATCH
. Au lieu de cela, la formule de tableau suivante est utilisée.
=MIN(IFERROR(1/(vnum>=vrng)*ROW(INDIRECT("1:"&ROWS(vrng))),ROWS(vrng)))
L'élément clé de cette formule est vnum>=vrng
, qui produit un tableau booléen dans lequel la première TRUE
se trouve dans la position de ligne qui contient la plus grande valeur d'index vertical inférieure à la valeur d'entrée. (L'utilisation de "> =" peut sembler contre-intuitive; elle est nécessaire car les index de la colonne sont dans l'ordre décroissant.) Le reste de la formule convertit cette position de ligne en un numéro de ligne.
Ces deux numéros de rangée supérieure et inférieure servent à calculer à la fois les valeurs d'index qui encadrent la valeur d'entrée supérieure et inférieure et les valeurs de la table intérieure correspondant à ces valeurs d'index.
Les numéros de colonne et les valeurs de colonne correspondants pour la plage d'index horizontal sont construits de manière similaire.
Les étapes restantes traitent de l'arithmétique de l'interpolation.
Avec toutes ces étapes, il peut sembler que le calcul des montants interpolés pour plusieurs valeurs d'entrée ne serait pas pratique. C'est en fait assez facile d'utiliser une table de données bidirectionnelle ("what-if").
La configuration de ces calculs pour plusieurs tables peut être simplifiée davantage en utilisant la version à formule unique. Pour l'utiliser, les plages nommées vnum
, hnum
, vrng
, hrng
, datarng
, validvnum
et validhnum
devront être configurées. Les tableaux doivent figurer sur des feuilles séparées ou dans des classeurs séparés. Si les feuilles sont séparées, les noms de chaque feuille doivent être définis pour avoir une étendue de feuille de calcul.
La formule de calcul en une étape serait alors entrée dans la cellule en haut à gauche du tableau de données. Cette formule à 2 100 caractères (moins un) est incluse dans la fiche de travail téléchargeable.
Une feuille de calcul contenant cet ensemble de calculs peut être téléchargée en utilisant ce lien .
En fait, vous avez un tableau à trois dimensions - x
et y
sont des variables indépendantes, et celle que vous devez trouver est z
.
Je connais une solution pour un tableau à deux jours, mais pour un plan à trois jours, elle devrait être semblable.
Ainsi, si vous disposez d'un tableau à deux dimensions, vous pouvez trouver la formule qui convient le mieux à vos données, à l'aide de la fonction "courbe de tendance" d'Excel. En utilisant cette formule, vous pouvez calculer y
pour tout x
x
par la valeur x souhaitéeSur la capture d'écran ci-dessous, A12: A16 correspond à x
, B12: B16 à y
et C12 contient une formule qui calcule y
pour toute x
.
En ce qui concerne votre cas (données 3D), Excel peut également créer des graphiques 3D, mais je ne sais pas s'ils ont des tendances 3D.
Utilisez la fonction Index et Match d'Excel en combinaison pour obtenir votre résultat. En utilisant les données ci-dessus, vous avez placé exactement dans Excel et dérivé la formule suivante. La formule est entrée dans la cellule D8.
=INDEX($B$3:$D$6,MATCH(E2,$A$3:$A$6,-1),MATCH(F2,$B$2:$D$2,-1))
J'ai écrit le code VBA pour interpolation bilinéaire que vous pouvez trouver ici: https://github.com/DanGolding/Linear-and-bilinear-interpolation-in-Excel
L’avantage de cette méthode est qu’il s’agit d’une fonction unique qui facilite l’interpolation d’une grille de valeurs comme indiqué dans cette image (notez que les cellules sont colorées en fonction des valeurs pour mieux visualiser l’effet de l’interpolation):
Voici la formule que vous recherchez: Étant donné deux points (x1, y1) et (x2, y2), pour interpoler entre eux, utilisez la formule:
y = (y2-y1)/(x2-x1) * (x-x1) + y1
où x est l'entrée et y la sortie. Étant donné le tableau suivant
La formule est la suivante: = IF (ISERROR (MATCH (O3, 4 R $: 10 R $)), 4 USD, SI (ISERROR (INDEX (4 R $: 10 R $, MATCH (3 O, 4 R $: 10 R)) +1) ), 10 S $ (INDEX (4 R $: 10 S $, MATCH (O3, 4 R $: 10 R $) +1,2)) - INDEX (4 R $: 10 S $, MATCH (O3, 4 R $: 10 R $), 2 ))/(INDEX (4 R $: S $ 10, MATCH (O3, R $ 4: R $ 10)) +1,1) -INDEX (4 RUS: 10 S $, MATCH (O3, R $ 4: R $ 10), 1)) * (O3-INDEX (4 R $: S $ 10, MATCH (O3, R $ 4: R $ 10), 1)) + INDEX (R $ 4: S $ 10, MATCH (O3, R $ 4: R $ 10), 2)))
Les fonctions iferror gèrent les points finaux. Ils conservent la valeur au point final plutôt que d'extrapoler.
Il est résolu avec trois fonctions combinées; Prévisions, décalage et correspondance.
=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))
La meilleure réponse à ce problème se trouve dans cette vidéo https://www.youtube.com/watch?v=LFUd5qF8nyE
La formule finale est
=FORECAST(C3,OFFSET(interpol_array,MATCH($C3,lookup_array,1)-1,0,2),OFFSET(lookup_array,MATCH($C3,lookup_array,1)-1,0,2))
Où "interpol_array" est défini comme la colonne à partir de laquelle vous voulez interpoler les valeurs et "lookup_array" est la colonne dans laquelle vous recherchez les valeurs.
Cette réponse indique également la même chose https://stackoverflow.com/questions/42877228/vlookup-and-interpolating