簡體   English   中英

Python中的Euler方法提供RuntimeError

[英]Euler's Method in Python giving RuntimeError

我必須為diffeq類編寫代碼以執行歐拉近似方法,步長為.5和1.。 當它是.5時,我的代碼可以正常運行並提供近似值。 但是,當它幾乎小於.5時,我得到

RuntimeError: maximum recursion depth exceeded in cmp

而且,如果我嘗試增加遞歸深度,最終會遇到Segmentation fault: 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()

if t==0您的停止條件過於具體,因此除非迭代在某個時刻精確地達到0 ,否則遞歸不會停止。

而是在t<=0 捕獲t==0 和以下的 t<=0

while t<=3:
    def x(t):
        if t<=0:
            return 1

您的問題來自浮點舍入錯誤。 如果通過調試器在t = 1.1110223 e-16(不等於0)的某一點運行它,那么它將無限次地開始運行到負數中。

我將比較更改為

if t < 0.001:

並且程序收斂到t值為3.0

不太重要的一點是,請在循環外部聲明x(t):函數,因為這會增加額外的開銷,並執行else語句

delta = x(t-h)
return delta + h*d(delta, t)

這樣就不會為每個數字兩次運行遞歸循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM