龙贝格积分公式(数值积分)

问题描述

利用龙贝格积分公式计算函数f(x)=(x^2+x+1)cos(x),在区间[0, pi/2]范围内的定积分近似值。

输入形式

在屏幕上龙贝格积分表行的最大值。

输出形式

龙贝格积分表。

样例输入

6

样例输出

[[0.78539816 0. 0. 0. ]

[1.72681266 2.04061749 0. 0. ]

[1.96053417 2.03844134 2.03829626 0. ]

[2.01879395 2.03821388 2.03819871 2.03819716]

[2.03334734 2.03819847 2.03819745 2.03819743]

[2.03698495 2.03819749 2.03819743 2.03819743]]

样例说明

输入:龙贝格积分表行的最大值n为6。输出:6行4列的龙贝格积分表。

代码

import numpy as np
import math


def Input():
    n = input()
    return 0, math.pi / 2, int(n)


def f(x):
    return (x ** 2 + x + 1) * math.cos(x)


def romber(a, b, n, tol):
    m = 1
    h = b - a
    err = 1
    j = 1
    R = np.zeros((n, n), dtype=np.double)
    R[0, 0] = h * (f(a) + f(b)) / 2
    while err > tol and j < n:
        h /= 2
        s = 0
        for p in range(1, m+1):
            x = a + h * (2 * p - 1)
            s += f(x)
        R[j, 0] = R[j-1, 0] / 2 + h * s
        m *= 2
        for k in range(1, j+1):
            R[j, k] = R[j, k-1] + (R[j, k-1] - R[j-1, k-1]) / (4 ** k - 1)

        err = abs(R[j-1, j-1]-R[j, j])
        j += 1

    return R


def out(x):
    print(x)


def main():
    a, b, n = Input()
    tol = np.finfo(np.float32).eps
    R = romber(a, b, n, tol)
    out(R[:, :4])


if __name__ == '__main__':
    main()
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值