Réécriture des boules imbriquées

Fermé
2.H.A - 13 oct. 2021 à 19:47
 2.H.A - 14 oct. 2021 à 10:15
Bonjour,

J'ai un soucis avec un bout de mon code source. J'espère que quelqu'un parmi vous m'aidera à voir plus clair l'erreur que je fais.

Je réalise cette suite d'instruction (produit Vecteur * Matrice * Vecteur) qui me permet d'obtenir le résultat escompté :

for(int m=0;m<listeMaille.size();m++) // Boucle sur les mailles du domaine de calcul.
{
iteTps = 0; // Initialiser l'itérateur en temps
double tmpD1 = 0.0; // Valeur du gradient de la densité pour chaque maille
while(iteTps < Dim_Temps) // Boule sur l'indice temps
{
tmpD1 += List_Sol_PB_Adjoint_Retropropage[iteTps] * (listMasse[m] * List_Acceleration_Champ_Direct[iteTps]) * dt; // Calcul du gradient
iteTps++;
}
lRho.push_back(tmpD1); // Stocker la veleur du gradient dans la maille m dans un vecteur qui représent le gradient dans tout le domaine de calcul
}


Ce bout de code sert à calculer la valeur du gradient pour chaque maille du domaine de calcul. Ici la variable "List_Sol_PB_Adjoint_Retropropage" est un vector de Vecteur, où Vecteur est une méthode de ma propre class "Vecteur.h". La taille de "List_Sol_PB_Adjoint_Retropropage" est 'Dim_Temps' tandis que la taille de chaque Vecteur dans "List_Sol_PB_Adjoint_Retropropage" est (Nombre de noeuds * 2). La variable "listMasse" est un vector de matrice carré, où chacune à la dimension (Nombre de noeuds * 2). Enfin la variable "List_Acceleration_Champ_Direct" est un vector de Vecteur analogue à la variable "List_Sol_PB_Adjoint_Retropropage". Le résultat de ce produit pour chaque maille du domaine de calcul est un salaire que je stocke dans un vector de double "lRho". La variable "dt" est un scalaire.

Cette partie de code fonctionne est fournit des résultats prédit par la théorie.

L'objectif est de réécrire cette partie d'une autre manière qui permet d'éviter de refaire certains calculs. En particulier, je souhaite isoler le calcul "(listMasse[m] * List_Acceleration_Champ_Direct[iteTps])".

Je propose donc la réécriture suivante :

for(int m=0;m<listeMaille.size();m++) // Boucle sur les mailles du domaine de calcul.
{
iteTps = 0; //Inititaliser l'itérateur en temps
Vecteur Somme_Temps_Rho(nbNodes*2); // Pour chaque maille, ce Vecteur stocke la somme, indice temps, des produits (Matrice de masse * L'accélération du champ direct)
while(iteTps < Dim_Temps)
{
// Ici nous effectuons la somme en temps, sachant que "Somme_Temps_Rho" est initialiser à zero au départ.
Somme_Temps_Rho = Somme_Temps_Rho + (listMasse[m] * List_Acceleration_Champ_Direct_1[iteTps]);
iteTps++;
}
// La taille de ce vecteur est le nombre de maille. Chauqe case contient un Vecteur dont la dimension est le nbNodes * 2
Derivee_Ope_Diff_PB_Direct_Rho_1.push_back(Somme_Temps_Rho);
}


for(int m=0;m<listeMaille.size();m++)
{
iteTps = 0;
// Ce scalaire représentent la valeur du gradient pour chaque maille
double tmpRho = 0.0;
while(iteTps < Dim_Temps)
{
tmpRho += List_Sol_PB_Adjoint_1_Retropropage[iteTps] * Derivee_Ope_Diff_PB_Direct_Rho_1[m] * dt; // Gradient Rho pour la maille m
iteTps++;
}
// La taille de ce vecteur est le nombre de maille.
lRho.push_back(tmpRho);
}


Selon moi il y a une erreur quelques part, car je devrais obtenir des vectors "lRho" similaires dans les deux cas de figure.

Est ce que quelqu'un peut m'aider à détecter l'erreur dans la deuxième écriture du code ?

Cordialement.

2HA.
A voir également:

3 réponses

yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
13 oct. 2021 à 21:52
bonjour,
une technique fréquemment utilisée, pour comprendre le comportement d'un code, est d'ajouter des instructions qui affichent des informations à propos des instructions utilisées et des valeurs des variables.
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
13 oct. 2021 à 22:03
est-ce ton premier exercice avec des tableaux et des pointeurs?
ton utilisation de Somme_Temps_Rho me semble extrêmement fantaisiste.
0
Bonjour,

Comment peut-on traquer les instructions tel que vous le décrivez ?
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
13 oct. 2021 à 22:19
Bonjour,

Ta décomposition ne marche pas. Tu as 2 grandeurs de ta somme qui dépendent de iteTpx, tu ne peux pas les séparer.
Tu veux calculer : lRho[m] = SommeSurI(Retro[i]*(M[m]*Acc[i])*dt).
On peut voir le problème en remplaçant les vecteurs et matrices par un simple scalaire. Je pose Retro[i]=i+1 M[m]=m Acc[i]=i+1 dt=1 (avec i=0 à 1)
Tu veux donc: iRho[m] = 1*(m*1)*1 + 2*(m*2)*1 = 5m
Tu calcules : Deriv[m] = (m*1) + (m*2) = 3m
et iRho[m] = 1*Deriv[m]*1 + 2*Deriv[m]*1 = 3m+6m.
Le résultat n'est pas bon. Retro[i] et Acc[i] ne peuvent pas être séparés.

Et si c'était valable, ta seconde boucle pourrait être optimisée pour ne faire qu'un seul produit matriciel car SommeSurI(Retro[i]*Deriv[m]*dt) peut s'écrire SommeSurI(Retro[i])*Deriv[m]*dt.

Pour optimiser tu peux déjà sortir le produit par dt de la boucle (mais l'optimiseur le fait assurément tout seul). Si la matrice listMasse[m] est inversible il doit y avoir un moyen de la sortir de la boucle, mais je n'y connais pas assez en math pour t'aider.
0
Bonjour,

Merci pour votre retour, je vais réfléchir à ce que vous avez écrit.
0