Réécriture des boules imbriquées
2.H.A
-
2.H.A -
2.H.A -
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é :
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 :
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.
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:
- Réécriture des boules imbriquées
- Jeux de boules gratuits à télécharger - Télécharger - Jeux vidéo
- Excel fonction si et ou imbriquées - Guide
- Fonctions SI et ESTVIDE imbriquées - Forum Excel
- Fonction SI ET imbriquées étendues colonnes ✓ - Forum LibreOffice / OpenOffice
- My sims boules de billard - Forum Jeux vidéo
3 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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.
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.
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.
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.
ton utilisation de Somme_Temps_Rho me semble extrêmement fantaisiste.
Comment peut-on traquer les instructions tel que vous le décrivez ?