2

次の初期値問題を 4 次のルンゲクッタを使って数値的に解くプログラムを書くことになっています。そのアルゴリズムは問題ではなく、終了したらソリューションを投稿できます。

問題は、Runge-Kutta に入れることができるものにきれいに分離することです。

e^(-x') = x' −x + exp(−t^3)
x(t=0) = 1

これはどのタイプの ODE と呼ばれていますか? またはこれを解決する方法は?私は数学よりも、CS のスキルとプログラミングの数値手法に自信を持っています。この問題についての洞察は役に立ちます。

更新: 誰かがソリューションに興味がある場合は、コードを以下に示します。面白い問題だと思いました。

import numpy as np
import matplotlib.pyplot as plt

def Newton(fn, dfn, xp_guess, x, t, tolerance):
    iterations = 0
    value = 100.
    max_iter = 100
    xp = xp_guess
    value = fn(t, x, xp)
    while (abs(value) > tolerance and iterations < max_iter):
        xp = xp - (value / dfn(t,x,xp))
        value = fn(t,x,xp)
        iterations += 1
    root = xp
    return root

tolerance = 0.00001
x_init = 1.
tmin = 0.0
tmax = 4.0
t = tmin
n = 1
y = 0.0
xp_init = 0.5

def fn(t,x,xp):
    '''
    0 = x' - x + e^(-t^3) - e^(-x')
    '''
    return (xp - x + np.e**(-t**3.) - np.e**(-xp))

def dfn(t,x,xp):
    return 1 + np.e**(-xp)

i = 0
h = 0.0001
tarr = np.arange(tmin, tmax, h)
y = np.zeros((len(tarr)))
x = x_init
xp = xp_init
for t in tarr:
    # RK4 with values coming from Newton's method
    y[i] = x
    f1 = Newton(fn, dfn, xp, x, t, tolerance)
    K1 = h * f1
    f2 = Newton(fn, dfn, f1, x+0.5*K1, t+0.5*h, tolerance)
    K2 = h * f2
    f3 = Newton(fn, dfn, f2, x+0.5*K2, t+0.5*h, tolerance)
    K3 = h * f3
    f4 = Newton(fn, dfn, f3, x+K3, t+h, tolerance)
    K4 = h * f4
    x = x + (K1+2.*K2+2.*K3+K4)/6.
    xp = f4
    i += 1

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(tarr, y)
plt.show()
4

3 に答える 3

4

ルンゲ・クッタの場合、解析解ではなく、数値解だけが必要です。

つまり、丸め誤差の範囲内に収まるように(x, t)受け取って返すコードを記述できる必要があります。そのコードはある種の反復近似アルゴリズムを実行でき、Runge-Kutta は完全に満足するでしょう。yexp(-y) == y - x + exp(-t**3)

それは役に立ちますか?

于 2011-04-02T05:36:50.643 に答える
2

Wolfram Alphaによると、ソリューションは次のようになります

始める前に、答えが何であるかを理解しておくと役立つことがわかります。

また、WolframAlphaのようなリソースがいつでも利用できることを知っておくと役立ちます。

PS-インターネット、Wolfram Alpha、Google、Wikipediaなどの時代の学生または教授であるとはどういう意味ですか?

于 2011-04-02T17:57:53.803 に答える
1

x - exp( -t^3) を K と書くと、exp(-y) = y - K; を解きたいとします。y = K + W(exp(-K)) を取得します。ここで、W はランバートの W 関数です。

于 2011-04-05T16:38:35.973 に答える