Forma correcta de calcular numéricamente una suma.
Estoy intentando calcular numéricamente una suma:
Σ(aᵢ * aⱼ / |rᵢ - rⱼ|)
Entiendo perfectamente que es una suma fácil, sin embargo, mi mente sigue dudando después de varios días si lo estoy haciendo correctamente.
Aquí está el esquema de un código en C++ que he escrito para calcularlo:
struct vecs{
float x;
float y;
float z;
float a;
};
struct vector_file{
int id;
vector<vecs> VAL;
};
vector<vector_file> VEC;
I[10][10]={}
double absolute_val(double xi, double yi, double zi, double xj, double yj, double zj){
return(sqrt(pow(xi-xj,2)+pow(yi-yj,2)+pow(zi-zj,2)));
}
for (int i=0;i<vec.size();i++){ for="" (int="" j=""></vec.size();i++){><i;j++){ double="" integ="0;" for="" (int="" k=""></i;j++){><vec[i].val.size();k++){ for="" (int="" l=""></vec[i].val.size();k++){><vec[j].val.size();l++){
integ+=vec[i].val[k].a*vec[j].val[l].a/absolute_val(vec[i].val[k].x,vec[i].val[k].y,vec[i].val[k].z,vec[j].val[l].x,vec[j].val[l].y, vec[j].val[l].z);
}
}
i[i][j]=integ;
}
}
solo necesito los elementos fuera de la diagonal y no necesito la parte triangular superior de la matriz ya que es análoga a la parte triangular inferior. lo he comprobado varias veces, sin embargo, todavía sigo volviendo y preguntándome si lo he hecho correctamente.
muchas gracias de antemano por tomarse el tiempo para revisarlo. integ+=”VEC[i].VAL[k].a*VEC[j].VAL[l].a/absolute_val(VEC[i].VAL[k].x,VEC[i].VAL[k].y,VEC[i].VAL[k].z,VEC[j].VAL[l].x,VEC[j].VAL[l].y,” vec[j].val[l].z);=”” }=”” }=”” i[i][j]=”integ;” }=”” }=”” ="" solo="" necesito="" los="" elementos="" fuera="" de="" la="" diagonal="" y="" no="" necesito="" la="" parte="" triangular="" superior="" de="" la="" matriz="" ya="" que="" es="" análoga="" a="" la="" parte="" triangular="" inferior.="" lo="" he="" comprobado="" varias="" veces,="" sin="" embargo,="" todavía="" sigo="" volviendo="" y="" preguntándome="" si="" lo="" he="" hecho="" correctamente.="" muchas="" gracias="" de="" antemano="" por="" tomarse="" el="" tiempo="" para=""></vec[j].val.size();l++){
integ+=vec[i].val[k].a*vec[j].val[l].a/absolute_val(vec[i].val[k].x,vec[i].val[k].y,vec[i].val[k].z,vec[j].val[l].x,vec[j].val[l].y, vec[j].val[l].z);
}
}
i[i][j]=integ;
}
}
solo necesito los elementos fuera de la diagonal y no necesito la parte triangular superior de la matriz ya que es análoga a la parte triangular inferior. lo he comprobado varias veces, sin embargo, todavía sigo volviendo y preguntándome si lo he hecho correctamente.
muchas gracias de antemano por tomarse el tiempo para revisarlo.>
davy.ai
Solución
El código en C++ proporcionado parece estar calculando correctamente la suma representada por la fórmula dada. El código define dos estructuras:
vecs
yvector_file
, y un vector de vector_filesVEC
. También define una matriz bidimensionalI
inicializada en 0.La función
absolute_val
calcula el valor absoluto de la distancia euclidiana entre dos puntos en el espacio, dadas sus coordenadas.Luego, el código realiza un ciclo anidado sobre los elementos de
VEC
, excluyendo los elementos de la diagonal (j < i
). Para cada par de archivos de vectorVEC[i]
yVEC[j]
, calcula la suma/integral utilizando un ciclo doblemente anidado sobre los elementos de los respectivos vectoresVAL
, y actualiza el elemento correspondiente de la matrizI
.En general, el código parece estar bien organizado e implementa correctamente la fórmula dada. Sin embargo, como es difícil verificar la corrección de los resultados sin acceso a los datos de entrada, podría valer la pena hacer algunas comprobaciones de integridad o comparar los resultados con otros métodos o software.