我正在尝试为Heun's method函数实现代码。但我也是在自适应风格中做到这一点。通常说矩形方法,如果你做自适应样式,你比较从a
到b
的区域,a
与a
和{{{}}的中心之和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)
。
感谢。
答案 0 :(得分:0)
Python不适用于递归编程,受默认递归深度和内存的限制,因为它不实现尾调用递归而有利于保留堆栈跟踪。
您可以使用sys模块识别递归限制,我的是1000:
>>> import sys
>>> sys.getrecursionlimit()
1000
您也可以设置递归限制,但这是不可取的,因为您的内存可能会耗尽,从而导致系统崩溃:
sys.setrecursionlimit(limit)
您应该考虑将您的功能重新实现为循环。