问题描述
我正在尝试实现功能的代码。
但是我也以适应性风格来做。
定期为矩形说的方法,如果你这样做自适应式的,你比较区域a
到b
,用的和a
以中心a
和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.73513792333
。
谢谢。
1楼
Python不适合递归编程,它受默认递归深度和内存的限制,因为它不执行尾部调用递归以保留堆栈跟踪。
您可以使用sys模块识别您的递归限制,我的是1000:
>>> import sys
>>> sys.getrecursionlimit()
1000
您还可以设置递归限制,但这是不可取的,因为您可能会用完内存,从而导致系统崩溃:
sys.setrecursionlimit(limit)
您应该考虑将功能重新实现为循环。