龙贝格函数求积

龙贝格函数求积

龙贝格函数求积

龙贝格求积公式也称为逐次分半加速法。是数值计算方法之一,用以求解数值积分。是在梯形公式、辛普森公式和柯特斯公式之间关系的基础上,构造出一种加速计算积分的方法。 作为一种外推算法,在不增加计算量的前提下提高了误差的精度。

求积步骤

龙贝格函数求积_第1张图片

算法设计

设计思想为

梯形公式经过 区间逐步分半的方法的梯形公式求积 就等于辛普森公式求积

辛普森公式经过 区间逐步分半的方法的梯形公式求积 就等于柯特斯公式求积

柯特斯公式经过 区间逐步分半的方法的梯形公式求积 就等于龙贝格公式求积

逐层递推下去就得到了Romberg公式的一般形式(T数表)

龙贝格函数求积_第2张图片

函数接口

T_2n(a, b, n, T_n):通过区间逐步分半的方法的复化梯形公式求积,对应步骤2

printm™: 打印T数表

fun(x):修改求积函数

Romberg(a, b, err_min): #a代表上限,b代表下限,err_min代表最小误差

该函数中采用了两个列表tm,tm1来分别存储相邻两行的值,该函数使用了两重循环,第一重循环计算第一列T0,第二重循环计算每一行的T(m+1), 最后计算误差(对角线上数的差值)与预期误差比较,为防止出现死循环设置了最大迭代次数kmax

代码

import math
import numpy as np 
from numpy import *  


def T_2n(a, b, n, T_n):     #计算T0(h/2)的函数, a 积分下限,b 积分上限, n是区间等分数
    if n<1:                
        print('n should larger than 1')
    h = (b - a)/n           #步长      
    sum_f = 0               #计算T(k,0)求和部分
    for k in range(0, n):
        sum_f = sum_f + fun(a + (k + 0.5)*h)
    T_2n = T_n/2. + sum_f*h/2.
    return T_2n

def printm(tm):
    for i in range(len(tm)):
        if(tm[i]!=0):
            print("%.5f"%(tm[i]),end=' ')
    print()


def Romberg(a, b, err_min):            #a代表上限,b代表下限,err_min代表最小误差
    kmax = 6                            #控制循环次数变量
    tm = zeros(kmax,dtype = float)      # 第m行所有的元素
    tm1 = zeros(kmax,dtype = float)     #第m+1行所有的元素   
    tm[0] = 1/2*(b-a)*(fun(a) + fun(b))  # 初始值,梯形求积公式
    printm(tm)
    err = 1
    k = 0
    np.set_printoptions(precision = 9)
    while(err>err_min and k <kmax-1):  #控制循环次数和误差
        n = 2**k                      # n是区间等分数
        m = 1
        tm1[0] = T_2n(a, b, n, tm[0]) 
        while(err>err_min and m <= (k+1)):  #控制循环次数
            tm1[m] = ((4**m)*tm1[m-1]-tm[m-1])/(4**m-1)  #对应步骤三
            result = tm1[m]
            err = abs(tm1[m]-tm[m-1])  #求误差,对应步骤四
            m = m+1
        tm = np.copy(tm1)
        k = k+1
        printm(tm)     
    return result

def fun(x):           #被积函数,  x为自变量
    f = x**4
    return f

print('\nMétodo de Romberg')
print('----------------------------------')
f1 = Romberg(0, 1,1.e-12)  
print('----------------------------------')
print('result = ',f1)

效果

龙贝格函数求积_第3张图片

你可能感兴趣的:(一些小作品)