我正在为摆在我面前的任务构建我自己的一套过程,但是我目前被困在三维泊松方程中,来求解由移动的带电粒子产生的势和磁场。
简而言之,细胞中的粒子由四个核心过程组成:
循环就会重复。我能做步骤(1),(2)和(4),但不能做泊松部分。我用Boris格式积分粒子,网格简单地被构造成cell[i][j][k],维数为K,分布过程有点棘手,但毕竟不是很难。
然而,令我惊讶的是,我找不到合适的库来解决三维泊松方程的有限差分法(FDM)。我开始认为我将不得不写我自己的解,但求解偏微分方程本身是一门科学,我被告知不要尝试这个解,因为如果我不正确地去做,结果可能是不稳定的。FFT也可能是一个解决方案,但我需要一些东西,即使边界条件不是周期性的,也能工作。
我的问题是:
你知道有什么适合C++的库吗?它将取泊松方程的右边,并计算得到的势?计算必须通过有限差分进行。另外,Poisson方程的右边实际上是指K点的整个网格,它是在网格的一个有限差分边上积分的。
很难写出我自己的泊松方程的解吗?你推荐什么算法?
你知道其他的解决办法吗?免费软件,写得很好的论文或文档,论文,任何东西。
事先谢谢你,这对我来说是一个非常严重的问题,因为我不能继续工作了。
发布于 2014-08-04 22:18:08
您可以尝试一些库,如利布网或第二笔交易。它们是由这种问题造成的.
发布于 2014-08-04 21:49:30
你可能会采取自己动手的方法。首先,写出你必须要解的方程组。
确定您将拥有多少变量,例如,每个单元格x单元格有3个变量。确定有多少方程将这些变量联系起来。
你应该有相同的变量数和方程数,说N。
然后,看看你的方程是否是线性的。如果是这样的话,您应该能够将系统写成AX = B,其中A是NxN矩阵,B是向量,X包含前面确定的所有变量(未知数)。
然后,用MATLAB或LU求解器求解线性系统A*X=B是相当简单的(C/C++代码很容易找到,可能需要200行代码)。
如果你的系统不是线性的,你可以使用牛顿-拉夫森方法.你必须用.= 0的形式写出你的所有方程。
然后,你必须计算所有方程的所有导数,并将它们放在一个所谓的雅可比矩阵J中。
方程n°i对变量n°j的导数在jacobian的n°i行和colum n°j中。也就是说,Ji = dfi_dXj。
您必须猜测X中所有变量的初始值,这应该离解决方案不远。
这个猜测不是解,所以它不会导致你所有的方程都是= 0。包含所有这些“应该被-0”值的向量是F. Fi是方程n°I的“剩余”;
当你计算了J和F_X时,你可以求解线性系统J*D = F_X,然后D包含向量X中当前变量与你想要的解之间的差异。
然后计算一个新的X,等于X。
如果系统不是线性的,新的X将更接近解,但是您必须多次重复这个过程(计算J,F_X,求解J*D = F_X,并设置X= and ),使其足够接近解。
这似乎太难设置,但实际上它是可行的。
嗯,在一维,这几乎是容易的,但在三维边界条件可能是乏味的。
编辑
另外,你必须选择如何表达变量的空间导数,这样你就可以把你的微分方程转换成离散方程,AKA离散化。您可以从一阶计划开始:
https://stackoverflow.com/questions/25127631
复制相似问题