Bonjour,
Je travaille comme développeur freelance et mon client actuel m’a donné un programme à réaliser.
Je dois coder une interpolation par spline bicubique en C++.
Je dois comparer mes valeurs à celles d’un programme python écrit en interne et qui utilise la fonction scipy.RectBivariateSpline.
Malgré une lecture approfondie du sujet sur plusieurs sites, je n’arrive pas à m’en sortir.
Voici le détail de mon problème:
Je reçois un fichier qui contient des valeurs de puissance sous forme de matrice.
Chaque valeur est associée à une valeur d’abscisse et une valeur d’ordonnée.
L’index de la ligne permet d’en déduire la valeur de l’abscisse idem pour l’index de colonne qui permet de déduire la valeur de l’ordonnée.
La matrice n’est pas de grande taille (max 600×600).
Le pas entre chaque valeur d’abscisse/ordonnée est est régulier.
Exemple:
abscisse: -5.0 -4.0 -3.0 -2.0 etc…
ordonnée: -6.0 -4.0 -2.0 0.0 2.0 etc…
Le calcul à réaliser est le suivant:
J’ai un point P(abscisse, ordonnée) et je dois interpoler sa valeur de puissance en fonction des valeurs de puissance des cellules de la matrice dans lesquelles je le localise.
Localisation:
En recherchant dans la matrice le 1er indice d’abscisse supérieur à l’abscisse de P, je peux en déduire le couple d’indices:
- absSupIdx (indice d’abscisse supérieur)
- absInfIdx (indice d’abscisse inférieur = absSupIdx – 1).
Idem pour l’ordonnée: - ordSupIdx (indice d’ordonnée supérieur)
- ordInfIdx (indice d’ordonnée inférieur = ordSupIdx – 1).
J’obtiens donc 2 paires d’indices: (absInfIdx, ordInfIdx) et (absSupIdx, ordSupIdx).
Pour avoir une matrice 4×4 nécessaire à l’interpolation par Spline bicubique, j’élargis aux cellules voisines des 4 cellules précédentes pour obtenir une matrice 4×4.
Pour chaque cellule de cette matrice, je peux associer une valeur d’abscisse, une valeur d’ordonnée et une valeur de puissance.
NOTE: lors de l’élargissement aux cellules voisines, si des indices sont en dehors de la matrice initiale (ie: indice < 0 ou indice > nombre d’éléments – 1 des lignes/colonnes), je complète la ligne/colonne par des 0 pour conserver une matrice 4×4. Si une des valeurs de P est complètement en dehors de la matrice initiale, le calcul est rejeté.
C’est ensuite que ça se complique !
Je n’arrive pas à comprendre comment déterminer la matrice de coefficients avec les valeurs des fonctions, les dérivées premières et secondes, etc…
Si j’arrive à déterminer correctement cette matrice, je pourrai ensuite l’inverser, ça je sais faire, et calculer la valeur interpolée.
Si la matrice inverse des coefficients peut être définie directement, ça m’évite de coder l’inversion.
Si on part de l’exemple suivant, comment interpoler la valeur de puissance du point P(7.099, -1.8) ?
Partant de mon algorithme de localisation, le point P est situé à l’intérieur des indices suivants: (330, 331) pour l’abscisse et (210, 211) pour l’ordonnée.
Ce qui donne les cellules encadrées en rouge et la matrice élargie encadrée en bleu sur l’image précédente.
Est-ce que quelqu’un pourrait m’expliquer (de manière détaillée si possible avec les valeurs de l’exemple) les calculs à réaliser pour définir les coefficients ai,j de la formule suivante:
Je me demande aussi s’il faut normaliser les valeurs d’abscisse et d’ordonnée pour que la cellule de la matrice élargie aux indices (0, 0) corresponde à des valeurs d’abscisse/ordonnée = (0.0, 0.0) ?
Toutes les autres valeurs étant aussi normalisées ainsi que les valeurs de P.
Pour info, la valeur interpolée par scipy.RectBivariateSpline est 4831,71270119
Votre aide me serait d’un grand secours et je vous remercie d’avance si vous pouviez m’orienter vers la bonne méthodologie parce que là je suis vraiment bloqué sur le sujet !
Cordialement.