首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等离子体物理细胞模拟中的C++维粒子-标准网格上的泊松方程求解器

等离子体物理细胞模拟中的C++维粒子-标准网格上的泊松方程求解器
EN

Stack Overflow用户
提问于 2014-08-04 21:12:04
回答 2查看 1.4K关注 0票数 1

我正在为摆在我面前的任务构建我自己的一套过程,但是我目前被困在三维泊松方程中,来求解由移动的带电粒子产生的势和磁场。

简而言之,细胞中的粒子由四个核心过程组成:

  1. 运动粒子的积分(从洛伦兹方程),
  2. 电荷密度分布到网格的节点(磁场的电流密度),
  3. 求解Poisson方程计算网格节点的电位和电磁场,
  4. 电场/磁场在粒子中的分布。

循环就会重复。我能做步骤(1),(2)和(4),但不能做泊松部分。我用Boris格式积分粒子,网格简单地被构造成cell[i][j][k],维数为K,分布过程有点棘手,但毕竟不是很难。

然而,令我惊讶的是,我找不到合适的库来解决三维泊松方程的有限差分法(FDM)。我开始认为我将不得不写我自己的解,但求解偏微分方程本身是一门科学,我被告知不要尝试这个解,因为如果我不正确地去做,结果可能是不稳定的。FFT也可能是一个解决方案,但我需要一些东西,即使边界条件不是周期性的,也能工作。

我的问题是:

你知道有什么适合C++的库吗?它将取泊松方程的右边,并计算得到的势?计算必须通过有限差分进行。另外,Poisson方程的右边实际上是指K点的整个网格,它是在网格的一个有限差分边上积分的。

很难写出我自己的泊松方程的解吗?你推荐什么算法?

你知道其他的解决办法吗?免费软件,写得很好的论文或文档,论文,任何东西。

事先谢谢你,这对我来说是一个非常严重的问题,因为我不能继续工作了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 22:18:08

您可以尝试一些库,如利布网第二笔交易。它们是由这种问题造成的.

票数 0
EN

Stack Overflow用户

发布于 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离散化。您可以从一阶计划开始:

  • df/dx = (fi+1 - fi)/dx
  • d2f/dx2 2= (2*fi - fi+1 - fi-1)/dx²
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25127631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档