首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mathematica的Poisson求解器

使用Mathematica的Poisson求解器
EN

Stack Overflow用户
提问于 2012-10-09 01:26:32
回答 1查看 449关注 0票数 2

我正在寻找一些帮助的泊松解决方案,我正在编写的数学。插入数组的代码相当长,但是详细信息可以在http://pastebin.com/uSrSDcW6上找到。

我用从泊松方程导出的中心差分法计算给定电荷密度的电压。在计算了电压后,我测试了数据集的收敛性。我将收敛阈值设置为10^-1000+。我将循环设置为在10000次迭代后启动,以防发生故障,作为故障安全。我有一个回路计数器的位置,以保持理智。只要收敛阈值设置为10^-100,程序似乎运行良好。

我的问题是:无论我更新阈值,例如,10^-100,10^-150,在633次迭代之后,计算停止,并退出循环。如果能帮上忙,我会很感激的,我完全被困住了。我增加了对程序的评论,这应该是对这个论坛上的任何人的解释。再次,我知道这个描述是有限的,所以请参阅附加的url http://pastebin.com/uSrSDcW6的完整程序。

*Update10/9/12***I've把我的问题归结为16位的机器精度。我需要把它打开,直到我的机器的最大精度达到10^309。关于如何做到这一点,Mathematica的帮助是很少的。前"NMachinePrecision,50“。在我的程序中,我会把这个设置在哪里,以便将它应用到所有的计算中?如果有帮助的话,我会在这里粘贴循环。

Vnew / Vold / RHO是10x10x34矩阵,Epsilon是一个常数

(将ConvergenceLoop初始化为O-如果有必要的话,这将用作退出循环的失败安全措施)

ConvergenceLoop = 0;

(将收敛初始化为零)

收敛= 0;

而[收敛性== 0 &&;ConvergenceLoop < 10000,

(运行所有i,j,k元素,计算新的电压值)

[Vnew[i][j][k]= (1/(2/deltaX^2 + 2/deltaY^2 + 2/deltaZ^2)) *((Vold[i+1][j][j][k]+)

代码语言:javascript
复制
 Vold[[i - 1]][[j]][[k]])/(deltaX^2)) + ((Vold[[i]][[j + 1]][[k]] + 

  Vold[[i]][[j - 1]][[k]])/(deltaY^2)) + ((Vold[[i]][[j]][[k + 1]] + 

   Vold[[i]][[j]][[k - 1]])/(deltaZ^2)) + ((Rho[[i]][[j]][[k]]/Epsilon))), {i, 2, 9}, {j, 2,9}, {k, 2, 33}];

(假设收敛,以便当测试到达超过定义的收敛阈值的第一个值时触发循环)

收敛= 1;

(这是收敛性检验。用户定义的收敛阈值)

代码语言:javascript
复制
 Do[If[Vold[[i]][[j]][[k]] == 0, Null, 

    If[(Vnew[[i]][[j]][[k]] - Vold[[i]][[j]][[k]])/Vold[[i]][[j]][[k]] > .0000001,               Convergence = 0;

(*This is purely diagnostic. I added a Tracker point to follow the convergence along. 

在任何元素处定义的用户*)

代码语言:javascript
复制
If[i == 5 && j == 5 && k == 10, 

 Print[ "Tracker Point" (Vnew[[i]][[j]][[k]] - 
      Vold[[i]][[j]][[k]])/Vold[[i]][[j]][[k]]], Null],Null]], {i, 2, 9}, {j, 2, 9}, {k, 2, 33}];

(忽略第一次迭代,直到Vnew和Vold成为非零)

IfConvergenceLoop < 2,收敛= 0,空;

(迫使Vold与Vnew一起进化)

Vold = Vnew;

ConvergenceLoop ++;]

(为未来规划目的添加SessionTime )

如果[ConvergenceLoop == 10000,

打印[“收敛环极限达到”。(SessionTime[]/3600)

打印“收敛环极限未达到”;

(我们脱离了while循环,这意味着我们的数据聚合了,所以打印聚合的值)

若[收敛== 1,

打印[ ConvergenceLoop ]祝贺会聚!MatrixForm Vnew],打印“没有汇合!”;

EN

回答 1

Stack Overflow用户

发布于 2012-10-10 01:49:28

由于根据上面的评论,您已经将此缩小到了我所怀疑的精度问题,请阅读以下内容:

Funny behaviour when plotting a polynomial of high degree and large coefficients

Global precision setting

Confused by (apparent) inconsistent precision

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12791659

复制
相关文章

相似问题

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