数值分析第四章实验(数值积分)

数值分析第四章实验(数值积分)

第一题

实现龙贝格积分算法,取 n=8,16,32,64,128 利用梯形公式,辛普森公式,龙贝格公式计算该积分,并与精确解进行比较

0.50.5sinxxdx

复制import numpy as np
import pandas as pd
from scipy.integrate import quadrature

龙贝格公式

复制def romberg(x_min, x_max, f, tol=1e-6):  # 龙贝格公式
    h = (x_max - x_min)
    x = np.linspace(x_min, x_max, 2)
    y = f(x)
    data = [[(f(x_min) + f(x_max)) / 2], []]
    data[0].append(data[0][0] / 2 + h * f((x_min + x_max) / 2) / 2)
    data[1].append((4 * data[0][1] - data[0][0]) / 3)
    h /= 2
    x = np.linspace(x_min, x_max, 3)
    i = 2
    while (np.abs(data[i - 1][0] - data[i - 2][0]) > tol):
        pow_2_i = 4
        x_new = (x[:-1] + x[1:]) / 2
        y_new = f(x_new)
        h /= 2
        x = np.linspace(x_min, x_max, pow_2_i + 1)
        data[0].append(data[0][i - 1] / 2 + h * np.sum(y_new))
        data.append([])
        pow_4_j = 4
        for j in range(i):
            data[j + 1].append(
                pow_4_j * data[j][i - j] / (pow_4_j - 1) - data[j][i - j - 1] / (pow_4_j - 1))
            pow_4_j <<= 2
        i += 1
        pow_2_i <<= 1
    return data[-1][0], data

梯形公式

复制def trapezium(x_min, x_max, f, n):  # 梯形公式
    x = np.linspace(x_min, x_max, n + 1)
    y = f(x)
    return (x_max - x_min) * (np.sum(y) - (y[0] + y[-1]) / 2) / n

辛普森公式

复制def simpson(x_min, x_max, f, n):  # 辛普森公式
    w = np.array([4 if i % 2 else 2 for i in range(n + 1)])
    w[0] = w[-1] = 1
    x = np.linspace(x_min, x_max, n + 1)
    y = f(x)
    return np.sum(w * y) * (x_max - x_min) / (3 * n)

计算

复制def fun(x):
    if type(x) == np.ndarray :
        return np.array([fun(t) for t in x])
    else:
        return np.sin(x) / x if x != 0 else 1
		
n = [8, 16, 32, 64, 128]
I, _ = romberg(-0.5, 0.5, fun)
I_gauss = quadrature(fun, -0.5, 0.5)[0]
trapezium_values = [trapezium(-0.5, 0.5, fun, t) for t in n]
simpson_values = [simpson(-0.5, 0.5, fun, t) for t in n]
df = pd.DataFrame(data={"梯形公式": trapezium_values, "辛普森公式": simpson_values, "龙贝格公式": [I for t in n],
                        "自适应高斯": [I_gauss for t in n]})
df
n 梯形公式 辛普森公式 龙贝格公式 自适应高斯
8 0.985791 0.986215 0.986215 0.986215
16 0.986109 0.986215 0.986215 0.986215
32 0.986188 0.986215 0.986215 0.986215
64 0.986208 0.986215 0.986215 0.986215
128 0.986213 0.986215 0.986215 0.986215

参考

  1. 李庆扬,王能超,易大义. 数值分析(第5版). 北京: 清华大学出版社, 2008.
头像
posted @   suxss  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示