梯度(斜率)的数值解

计算科学 数字
2021-11-30 04:50:49

抽象的

对于我的问题,我有下一个方程来找到一个力:

U=m(x)×B(x)dV
F=U

考虑具有 x,y,z 坐标的 3 维空间,因此,mB描述 3D 空间中某个点的值。通过 C++ 计算。每个值描述为:

class Vector3
{
public:
float x;
float y;
float z;
Vector3(float x, float y, float z)
{
   this->x=x;
   this->y=y;
   this->z=z;
}
};

Vector3 *m[1000];
Vector3 *B[1000];
Vector3 *F[1000];

使用:从字面上找到每个点的 F 向量是不可能的,所以我会通过一些步骤找到值。例如,考虑一些 1m*1m*1m 的体积,我会找到步长为 100mm 的值,所以对于那个体积我需要计算1m100mm1m100mm1m100mm=103=1000 points.

填充数组,我认为应该是下一个方法:

 int count=0;
 for(float x=0.0f;x<1.0f;x+=0.1f)
  for(float y=0.0f;y<1.0f;y+=0.1f) 
   for(float Z=0.0f;z<1.0f;z+=0.1f, count++)
      F[count]=new Vector3(...)\\here I calculate the formulas above

而且我有粒子,移动更顺畅,当然,不是 100 毫米的步长,所以我只会计算哪个点是最近的,或者那个点中最近点的平均值。

如果我确实有一个数组,我应该如何处理它mB在每一点,但不是一个分析函数,描述了该值的分布?

作为输出,我还需要数组F在每一点。

想法

我数学不好,可能有错误的假设。上面的公式是为求力场而写的。但在我的情况下需要它是“dotty”的。这是某一点的势能。

m(x)×B(x)=JTT=Joules=Potential Energy

但这没有任何意义,因为我需要两个电位之间的差异那么如果要计算呢F(x)(在某一点)作为

F(x)=U(x+k)U(x)k
服用k=step=100mm?

1个回答

我认为这个问题需要更多细节,但你不能只使用高斯散度定理来移动积分内的梯度并将体积积分转换为表面积分。也许您可以使用最小二乘法来获得每个单元格中的梯度?