当前位置: 代码迷 >> python >> 如何在python中实现自适应heun方法?
  详细解决方案

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

热度:30   发布时间:2023-06-27 21:22:51.0

我正在尝试实现功能的代码。 但是我也以适应性风格来做。 定期为矩形说的方法,如果你这样做自适应式的,你比较区域ab ,用的和a以中心ab ,然后从该中心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

谢谢。

Python不适合递归编程,它受默认递归深度和内存的限制,因为它不执行尾部调用递归以保留堆栈跟踪。

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

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

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

sys.setrecursionlimit(limit)

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