我在C中制作了一组函数,用于模拟一个微正方形的序列(具有固定能量和体积的N个粒子的周期性有界盒子)。关键是我的一个主要功能是以获得2个粒子之间的距离,而有时它会返回0,即使粒子不是那么接近。
功能是
// Determinar la mínima distancia dadas dos coordenadasy una longitud de caja periodica
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
如果你想查看所有代码,你可以看到它 https://gitlab.com/jarr.tecn/statistical_mechanics
在文件box.h中 和ejemplo.h中的一个例子
答案 0 :(得分:3)
问题来自abs
函数,它将返回一个整数:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
float pdist2(float x1, float y1, float x2, float y2, float a) {
float Dx = fabsf(x2-x1);
float Dy = fabsf(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
int main(void)
{
printf("first form: %f\n", pdist(.1, .1, .2, .2, .5));
printf("second form: %f\n", pdist2(.1, .1, .2, .2, .5));
}
给出:
first form: 0.000000
second form: 0.141421