昆仑山:眼中无形心中有穴之穴人合一

夫君子之行,静以修身,俭以养德;非澹泊无以明志,非宁静无以致远。夫学须静也,才须学也;非学无以广才,非志无以成学。怠慢则不能励精,险躁则不能冶性。年与时驰,意与岁去,遂成枯落,多不接世。悲守穷庐,将复何及!

 

利用梯形公式,simpson公式,Newton公式,Cotes公式,复化梯形公式,复化Simpson公式,复化Cotes公式 计算 定积分 被积函数x/(4+x^2) 积分区间[0,1]


import numpy as np


# 定义被积函数
def f(x):
    return x / (4 + x ** 2)


# 精确值
exact_value = 0.5 * np.log(5 / 4)
print(f"精确值: {exact_value:.8f}")


# 1. 梯形公式
def trapezoidal_rule(a, b, n):
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = delta_x / 2 * (y[0] + 2 * np.sum(y[1:-1]) + y[-1])
    return integral


# 2. 辛普森公式
def simpson_rule(a, b, n):
    if n % 2 != 0:
        raise ValueError("n 必须是偶数")
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = delta_x / 3 * (y[0] + 4 * np.sum(y[1:-1:2]) + 2 * np.sum(y[2:-2:2]) + y[-1])
    return integral


# 3. 三阶牛顿-科茨公式 (Simpson 3/8 Rule)
def newton_cotes_3(a, b, n):
    if n % 3 != 0:
        raise ValueError("n 必须是3的倍数")
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = 3 * delta_x / 8 * (y[0] + 3 * np.sum(y[1:-1:3]) + 3 * np.sum(y[2:-1:3]) + 2 * np.sum(y[3:-1:3]) + y[-1])
    return integral


# 4. 四阶科茨公式
def cotes_4(a, b, n):
    if n % 4 != 0:
        raise ValueError("n 必须是4的倍数")
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    weights = np.ones(n + 1)
    weights[0::4] = 7
    weights[1::4] = 32
    weights[2::4] = 12
    weights[3::4] = 32
    weights[-1] = 7
    integral = 2 * delta_x / 45 * np.sum(y * weights)
    return integral


# 5. 复化梯形公式
def composite_trapezoidal(a, b, n):
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = delta_x * (0.5 * y[0] + np.sum(y[1:-1]) + 0.5 * y[-1])
    return integral


# 6. 复化辛普森公式
def composite_simpson(a, b, n):
    if n % 2 != 0:
        raise ValueError("n 必须是偶数")
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = delta_x / 3 * (y[0] + 4 * np.sum(y[1:-1:2]) + 2 * np.sum(y[2:-2:2]) + y[-1])
    return integral


# 7. 复化四阶科茨公式
def composite_cotes_4(a, b, n):
    if n % 4 != 0:
        raise ValueError("n 必须是4的倍数")
    delta_x = (b - a) / n
    x = np.linspace(a, b, n + 1)
    y = f(x)
    integral = 0
    for i in range(0, n, 4):
        integral += (2 * delta_x / 45) * (7 * y[i] + 32 * y[i + 1] + 12 * y[i + 2] + 32 * y[i + 3] + 7 * y[i + 4])
    return integral


# 计算并输出结果
a, b = 0, 1  # 积分区间 [0, 1]

# 简单公式
print("\n简单公式结果:")
trap_result = trapezoidal_rule(a, b, 4)
print(f"梯形公式 (n=4): {trap_result:.8f}, 误差: {abs(trap_result - exact_value):.8f}")

simp_result = simpson_rule(a, b, 4)
print(f"辛普森公式 (n=4): {simp_result:.8f}, 误差: {abs(simp_result - exact_value):.8f}")

nc3_result = newton_cotes_3(a, b, 3)
print(f"三阶牛顿-科茨公式 (n=3): {nc3_result:.8f}, 误差: {abs(nc3_result - exact_value):.8f}")

cotes4_result = cotes_4(a, b, 4)
print(f"四阶科茨公式 (n=4): {cotes4_result:.8f}, 误差: {abs(cotes4_result - exact_value):.8f}")

# 复化公式
print("\n复化公式结果:")
comp_trap_result = composite_trapezoidal(a, b, 12)
print(f"复化梯形公式 (n=4): {comp_trap_result:.8f}, 误差: {abs(comp_trap_result - exact_value):.8f}")

comp_simp_result = composite_simpson(a, b, 12)
print(f"复化辛普森公式 (n=4): {comp_simp_result:.8f}, 误差: {abs(comp_simp_result - exact_value):.8f}")

comp_cotes4_result = composite_cotes_4(a, b, 12)
print(f"复化四阶科茨公式 (n=4): {comp_cotes4_result:.8f}, 误差: {abs(comp_cotes4_result - exact_value):.8f}")



posted on 2025-04-01 12:54  Indian_Mysore  阅读(25)  评论(0)    收藏  举报

导航