我正在寻找一些我在Mathematica上写的泊松求解器的帮助。插入Arrays时代码很长,但可以在http://pastebin.com/uSrSDcW6
找到完整的详细信息我正在使用源自泊松方程的中心差分法计算电荷密度。在计算电压后,我测试数据集以进行收敛。我设置的收敛阈值大约为10 ^ -1000 +。我将循环设置为在10000次迭代后启动,以防止出现问题,作为故障安全。为了理智,我有一个循环计数器。只要收敛阈值设置为10 ^ -100,该程序似乎运行良好。
我的问题是:无论我更新阈值,ex,10 ^ -100,10 ^ -150,计算在633次迭代后停止并且开始循环。我很感激任何帮助,我完全陷入困境。我在程序中添加了评论,这个评论对于论坛上的任何人都应该是解释性的。同样,我知道此说明是有限的,因此请参阅附加的网址http://pastebin.com/uSrSDcW6以获取完整的程序。
* 更新 10/9/12 ***我已将我的问题分解为16位机器精度。我需要打开我的机器最大精度10 ^ 309。 Mathematica帮助很少,如何做到这一点。 ex“N [MachinePrecision,50]”。我将在程序中将其设置为将其应用于所有计算?如果有帮助,我会在这里粘贴循环
Vnew / Vold / RHO是10x10x34矩阵 Epsilon是一个常数 (将ConvergenceLoop初始化为O - 如果需要,这将作为一个失败的安全措施来启动循环)
ConvergenceLoop = 0;
(将收敛初始化为零)
融合= 0;
虽然[Convergence == 0&& ConvergenceLoop< 10000,
(遍历所有i,j,k元素,计算新电压值)
[Vnew [[i]] [[j]] [[k]] =(1 /(2 / deltaX ^ 2 + 2 / deltaY ^ 2 + 2 / deltaZ ^ 2))*(((Vold [[i + 1]] [[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非零)
如果[ConvergenceLoop< 2,Convergence = 0,Null];
( Forces Vold与Vnew一起发展)
Vold = Vnew;
ConvergenceLoop ++;]
(为了将来的计划目的添加了SessionTime )
如果[ConvergenceLoop == 10000,
打印[“达到收敛循环限制。”(SessionTime [] / 3600)],
打印[“未达到收敛循环限制。”];
(我们突破了while循环,意味着我们的数据汇聚了,所以打印收敛值)
如果[收敛== 1,
打印[ConvergenceLoop“祝贺融合!” MatrixForm [Vnew]],打印[“没有聚合!”]];
答案 0 :(得分:0)