欧拉';Python中的s方法给出RuntimeError

欧拉';Python中的s方法给出RuntimeError,python,recursion,differential-equations,Python,Recursion,Differential Equations,我必须编写代码,在步长为.5和.1的情况下,对diffeq类执行Euler近似方法。当它是.5时,我的代码运行良好,并提供近似值。然而,当它几乎小于0.5时,我得到 RuntimeError: maximum recursion depth exceeded in cmp 如果我尝试增加递归深度,我最终会得到分段错误:11 这是代码。请帮助我找出为什么会出现递归错误,或者如何改进代码以减少递归 import sys from pylab import * h=.4 t=0 dep=[] ind

我必须编写代码,在步长为.5和.1的情况下,对diffeq类执行Euler近似方法。当它是.5时,我的代码运行良好,并提供近似值。然而,当它几乎小于0.5时,我得到

RuntimeError: maximum recursion depth exceeded in cmp
如果我尝试增加递归深度,我最终会得到
分段错误:11

这是代码。请帮助我找出为什么会出现递归错误,或者如何改进代码以减少递归

import sys
from pylab import *
h=.4
t=0
dep=[]
ind=[]
def sqr(q):
    return q*q
def d(x,t):
    return x+sqr(t)-2
while t<=3:
    def x(t):
        if t==0:
            return 1
        else:
            return x(t-h)+h*d(x(t-h),t)
    dep.append(x(t))
    ind.append(t)
    t+=h
plot(ind,dep,'o')
t=arange(0,3,.01)
x=exp(t)-t*(t+2)
plot(t,x,)
title("Euler's Method for dx/dt=x+t^2-2")
xlabel('t')
ylabel('x')
show()
导入系统 从派拉布进口* h=.4 t=0 dep=[] ind=[] def sqr(q): 返回q*q def d(x,t): 返回x+sqr(t)-2
当t如果t==0,则停止条件
过于具体,因此除非迭代在某个点准确地到达
0
,否则递归不会停止


相反,用
t捕获
t==0
及其以下的
t,您的问题来自浮点舍入错误。如果在一个点t=1.1110223 e-16(不等于0)通过调试器运行它,则它将无限次地运行到负数

我把比较改为

if t < 0.001:

这样它就不会对每个数字运行两次递归循环。

为什么,我改变了t条件,现在它运行的h变小了。谢谢大家!@保罗:如果你想在过零点之前打破这一步的迭代,最好在过零点时打破,然后回头看一站。0.001太武断了,除非你有理由,否则每次输入都会在你希望的地方中断,最好用更稳健的方式解决。如果你手工操作,迭代将始终变为0。。。问题来自浮点舍入。如果x~0。。。但是对于这个特定的算法,这将实现目标。顺便说一句,泽克,如果这个答案对你有效,接受它也没什么坏处
if t < 0.001:
delta = x(t-h)
return delta + h*d(delta, t)