如何在python中实现自适应heun的方法?

时间:2014-03-14 20:24:22

标签: python differential-equations approximation

我正在尝试为Heun's method函数实现代码。但我也是在自适应风格中做到这一点。通常说矩形方法,如果你做自适应样式,你比较从ab的区域,aa和{{{}}的中心之和1}}然后从该中心到b。如果它与公差相同,则返回总和,如果不是,则在两个间隔递归。

这是我到目前为止所得到的:

b

但是我的最大递归深度超出了错误。有谁知道这里有什么不对吗?我应该得到import math def k(x,y): return math.sin(x+y) ''' h is the step size ''' def Heun(f,x,y,h,end): while x < end: f0=f(x,y) z=y+h*f0 x+=h f1=f(x,z) y+=h*0.5*(f0+f1) return y def AdaptDiff(diffF,f,x,y,h,end,tol): if abs(1.-x/end) < tol: return y y1=diffF(f,x,y,1,x+h) y_=diffF(f,x,y,1,x+h/2.) y2=diffF(f,x+h/2.,y_,1,x+h) if abs(1.-y1/y2) > tol: return AdaptDiff(diffF,f,x+h/2.,y2,h/2.,end,tol) return AdaptDiff(diffF,f,x+h,y1,h*2.,end,tol) print AdaptDiff(Heun,k,0,1,1/2.,1,1e-10)

感谢。

1 个答案:

答案 0 :(得分:0)

Python不适用于递归编程,受默认递归深度和内存的限制,因为它不实现尾调用递归而有利于保留堆栈跟踪。

您可以使用sys模块识别递归限制,我的是1000:

>>> import sys
>>> sys.getrecursionlimit()
1000

您也可以设置递归限制,但这是不可取的,因为您的内存可能会耗尽,从而导致系统崩溃:

sys.setrecursionlimit(limit)

您应该考虑将您的功能重新实现为循环。