コード例 #1
0
ファイル: ode.py プロジェクト: FreedomFaighter/numerical
def extrapolation(f, a, b, alpha, TOL, hmax, hmin):
    NK = np.array([2, 4, 6, 8, 12, 16, 24, 32])
    TO = a
    WO = alpha
    h = hmax
    FLAG = 1
    Q = np.array([[]])
    Q.resize((7, 7))
    for i in range(0, 7, 1):
        for j in range(0, i + 1, 1):
            Q[i, j] = (NK[i + 1] / NK[j]) ** 2
    while FLAG == 1:
        k = 0
        NFLAG = 0
        y = np.array([])
        y.resize((8))
        while k < 8 and NFLAGS == 0:
            HK = h / NK[k]
            T = TO
            W2 = WO
            W3 = W2 + HK * f(T, W2)
            for j in range(1, NK[k] - 1):
                W1 = W2 
                W2 = W3 
                W3 = W1 + 2. * HK * f(T, W2)
                T = TO + (j + 1) * HK
            y[k] = (W3 + W2 + HK * f(T, W3)) / 2.
            if k >= 1:
                j = k
                v = y[0]
                while j >= 1:
                    y[j - 1] = y[j] + (y[j] - y[j - 1]) / (Q[k - 1, j - 1] - 1)
                    j -= 1
                if abs(y[0] - v) <= TOL:
                    NFLAG = 1
            k += 1
        k -= 1
        if NFLAG == 0:
            h = h / 2.
            if h < hmin:
                FLAG = 0
        else:
            WO = y[0]
            TO += h
            yield (TO, WO, h)
            if TO >= b:
                FLAG = 0
            elif TO + h > b:
                h = b - TO
            elif k <= 3 and h < 0.5 * hmax:
                h = 2. * h
コード例 #2
0
ファイル: ode.py プロジェクト: FreedomFaighter/numerical
def rungekutta_systems(f, a, b, m, N, alpha):
    w = np.array([])
    w.resize((m))
    k = np.array([[]])
    k.resize((4,m))
    h = (b - a) / N
    t = a
    for j in range(0, m, 1):
        w[j] = alpha[j]
    yield (t, w)
    for i in range(0, N, 1):
        for j in range(0, m, 1):
            k[0, j] = h * f[j](t, w)
        for j in range(0, m, 1):
            k[1, j] = h * f[j](t + 0.5 * h, w + 0.5 * k[0, :])
        for j in range(0, m, 1):
            k[2, j] = h * f[j](t + 0.5 * h, w + 0.5 * k[1, :])
        for j in range(0, m, 1):
            k[3, j] = h * f[j](t + h, w + k[2,:])
        for j in range(0, m, 1):
            w += (k[0,:] + 2. * k[1,:] + 2. * k[2,:] + k[3,:]) / 6.
        t = a + i * h
        yield (t, w)
コード例 #3
0
ファイル: ode.py プロジェクト: FreedomFaighter/numerical
def adams_fourthorder_predictorcorrector(f, a, b, N, alpha):
    h = (b - a) / N
    t = np.array([a])
    w = np.array([alpha])
    yield (t[0], w[0])
    for i in range(1, 4, 1):
        K1 = h * f(t[i - 1], w[i - 1])
        K2 = h * f(t[i - 1] + h / 2., w[i - 1] + K1 / 2.)
        K3 = h * f(t[i - 1] + h / 2., w[i - 1] + K2 / 2.)
        K4 = h * f(t[i - 1] + h, w[i - 1] + K3)
        
        w[i] = w[i - 1] + (K1 + 2. * K2 + 2. * K3 + K4) / 6.
        t[i] = a + i * h
        yield (t[i], w[i])
    for i in range(4, N + 1, 1):
        ti = a + i * h
        wi = w[3] + h * (55. * f(t[3], w[3]) - 59. * f(t[2], w[2]) + 37. * f(t[1], w[1]) - 9. * f(t[0], w[0])) / 24.
        wi = w[3] + h * (9 * f(ti, wi) + 19. * f(t[3], w[3]) - 5 * f(t[2], w[2]) + f(t[1], w[1])) / 24.
        yield (ti, wi)
        for j in range(0, 3, 1):
            t[j] = t[j + 1]
            w[j] = w[j + 1]
        t[3] = ti
        w[3] = wi