精细积分python实现

精细积分

《计算机科学计算》张宏伟 第二版 p258

计算dx(t)/dt=Ax(t)的近似解,初值条件为x(t0)=x0

import numpy as np

N = 20  # 步长h细分为2^N


def precise_integration(A, x0, h, t0, t1):
    """
    计算dx(t)/dt=Ax(t)的近似解,初值条件为x(t0)=x0
    :param A: 矩阵A
    :param x0: 初值x0
    :param h: 时间步长h
    :param t0: 区间左端点t0
    :param t1: 区间右端点t1
    :return: 近似解x
    """
    n = len(x0)  # 未知数个数
    m = int((t1 - t0) / h)
    I = np.eye(N=n)
    x = np.mat(np.zeros((n, m + 1)))
    x[:, 0] = x0.reshape(3, 1)  # 初值
    dt = float(h) / pow(2, N)  # 精细化步长
    At = A * dt
    BigT = At * (I + At * (I + At / 3.0 * (I + At / 4.0)) / 2.0)
    for i in range(N):
        BigT = 2 * BigT + np.dot(BigT, BigT)
    BigT += I
    for i in range(m):
        x[:, i + 1] = np.dot(BigT, x[:, i])
    return x

def evaluate(t):
    """
    计算真实值
    :param t:自变量t
    :return:x(t)
    """
    return -1 / 6.0 * np.array([-1 + 3 * np.exp(2 * t) - 8 * np.exp(3 * t), -5 + 3 * np.exp(2 * t) - 4 * np.exp(3 * t),
                                -2 - 4 * np.exp(3 * t)])


if __name__ == "__main__":
    # 已知A,x0
    A = np.mat([[3, -1, 1],
                [2, 0, -1],
                [1, -1, 2]])
    x0 = np.array([1, 1, 1])

    # 步长,区间端点
    h = 0.2
    t0 = 0
    t1 = 1
    
    X = precise_integration(A, x0, h, t0, t1)
    print(X)
    x1 = evaluate(1)
    print(x1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章