欧拉';Python中的s方法给出RuntimeError
我必须编写代码,在步长为.5和.1的情况下,对diffeq类执行Euler近似方法。当它是.5时,我的代码运行良好,并提供近似值。然而,当它几乎小于0.5时,我得到欧拉';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
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)