我正在寻找一些帮助的泊松解决方案,我正在编写的数学。插入数组的代码相当长,但是详细信息可以在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]+)
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;
(这是收敛性检验。用户定义的收敛阈值)
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. 在任何元素处定义的用户*)
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],打印“没有汇合!”;
发布于 2012-10-10 01:49:28
https://stackoverflow.com/questions/12791659
复制相似问题