数值积分上机课写的 Python 代码,实现常微分方程数值求解。

import numpy as np


def improved_euler(f, y0, x_range, h):
    
    
    def predict(x, y):
        return y + h * f(x, y)
    
    
    def correction(x, y):
        return y + h / 2 * (f(x, y) + f(x + h, predict(x, y)))
    
    
    X = np.append(np.arange(x_range[0], x_range[1], h), x_range[1])
    Y = [y0]
    for i in range(len(X) - 1):
        Y.append(correction(X[i], Y[i]))
        
    return np.array(Y)


def fourth_order_classical_RK(f, y0, x_range, h):
    
    
    def get_K(x, y):
        K_1 = f(x, y)
        K_2 = f(x + h / 2, y + h / 2 * K_1)
        K_3 = f(x + h / 2, y + h / 2 * K_2)
        K_4 = f(x + h, y + h * K_3)
        
        return K_1, K_2, K_3, K_4
    
    
    X = np.append(np.arange(x_range[0], x_range[1], h), x_range[1])
    Y = [y0]
    for i in range(len(X) - 1):
        K = get_K(X[i], Y[i])
        Y.append(Y[i] + h / 6 * (K[0] + 2 * K[1] + 2 * K[2] + K[3]))
    
    return np.array(Y)