2

.5 および .1 のステップ サイズの diffeq クラスに対してオイラーの近似法を実行するコードを作成する必要があります。.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()
4

2 に答える 2

0

停止条件if t==0が具体的すぎるため、ある時点で反復が正確 0にヒットしない限り、再帰は停止しません。

代わりに以下をキャッチt==0 し、以下を使用しt<=0ます。

while t<=3:
    def x(t):
        if t<=0:
            return 1
于 2013-09-26T03:42:27.727 に答える
0

あなたの問題は、浮動小数点の丸め誤差から来ています。ある時点 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)

数値ごとに再帰ループを 2 回実行しないようにします。

于 2013-09-26T03:50:30.527 に答える