Poisson解算器使用Mathematica

时间:2012-10-09 01:26:32

标签: wolfram-mathematica solver poisson

我正在寻找一些我在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]],打印[“没有聚合!”]];

1 个答案:

答案 0 :(得分:0)

根据上述评论,您已将此范围缩小为我所怀疑的精确问题,请阅读以下内容:

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

Global precision setting

Confused by (apparent) inconsistent precision