数值积分

一. 组合梯形公式(数值积分)

【问题描述】组合梯形公式求函数f(x)=2+sin(2*sqrt(x))的积分近似值。

【输入形式】在屏幕上依次输入积分上限、下限和等距子区间个数。

【输出形式】输出使用组合梯形公式求得的积分近似值。

【样例1输入】

1 6 10

【样例1输出】

8.19385457

【样例1说明】输入:积分上限a为1、下限b为6和等距子区间个数m为10。输出:积分近似值(保留小数点后8位有效数字)

【评分标准】根据输入得到的输出准确

二. 组合辛普森公式(数值积分)

【问题描述】组合辛普森公式求函数f(x)=2+sin(2*sqrt(x))的积分近似值。

【输入形式】在屏幕上依次输入积分上限、下限和等距子区间个数。

【输出形式】输出使用组合辛普森公式求得的积分近似值。

【样例1输入】

1 6 5

【样例1输出】

8.18301549

【样例1说明】输入:积分上限a为1、下限b为6和等距子区间个数m为5。输出:积分近似值(保留小数点后8位有效数字)

【评分标准】根据输入得到的输出准确

import math

def fun(x):
    return math.sin(2*math.sqrt(x))+2

# 复合梯度
def tx(a,b,m):
    h = (b-a)/m
    s = 0
    for i in range(1,m):
        x = a+h*i
        s = s+fun(x) #s=f1+f2+----+fm-1
    result = (h/2)*(fun(a)+s*2+fun(b))
    return result

#复合辛普森
def xps(a,b,m):
    h = (b-a)/(2*m)
    s1 = 0
    s2 = 0
    for i in range(1,m+1):
        x = a+ h*(2*i -1)
        s1 = s1+fun(x)
    s1 = 4*h*s1/3
    for i in range(1,m):
        x = a+ h*2*i
        s2 = s2+fun(x)
    s2 = 2 * h * s2 / 3
    result = (h/3)*(fun(a)+fun(b))+s1+s2
    return result
 """
 def xps(a,b,m):
    h = (b-a)/(2*m)
    s1 = 0
    for i in range(1,m+1):
        x = a+ h*2*i
        s1 = s1+fun(x)+4*fun(x-h)+fun(x-2*h)
    result = (h/3)*s1
    return result
"""


def main():
    a,b,m= input().split()
    a =int(a)
    b =int(b)
    m =int(m)
    print("%.8f"%xps(a, b, m))
if __name__ == '__main__':
    main()
三. 龙贝格积分(数值积分)

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

【输入形式】在屏幕上龙贝格积分表行的最大值。

【输出形式】龙贝格积分表。

【样例1输入】

6

【样例1输出】

[[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]]

【样例1说明】输入:龙贝格积分表行的最大值n为6。输出:6行4列的龙贝格积分表。

【评分标准】根据输入得到的输出准确

import math
import numpy as np

def fun(x):
    return (x**2 + x + 1) * math.cos(x)
#龙贝格积分
def romber(a,b,n):
    # M为区间个数
    M = 1
    # h为区间长度
    h = b-a
    err = 1
    # j是 2**j=2M
    j = 0
    R = np.zeros([n, 4], dtype=np.double)
    R[0,0] = h*(fun(a)+fun(b))/2
    # 第一列
    while( j < n-1 ):
        h = h/2
        s = 0
        for k in range(1, M+1):
            x = a + h*(2*k-1)
            s = s + fun(x)
        R[j+1, 0] = R[j, 0]/2 + h*s
        j = j + 1
        M = 2*M
    #向下算
    for k in range(1,4):
        for j in range(k,n):
             R[j, k] = R[j, k-1] + (R[j, k-1]-R[j-1, k-1])/(4**k-1)
    print(R)

def main():
    n = int(input())
    a = 0
    b = math.pi/2
    romber(a, b, n)
if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值