龙贝格求积算法

龙贝格求积算法python实现

import numpy as np

def trapezoid(a, b, n, func):
    """
    复化梯形公式求函数func在区间[a,b]上的积分值
    n是等分的区间数目
    """
    x = np.linspace(a, b, num=n + 1)
    y = func(x)
    h = (b - a) / (2 * n)
    return h * (y[0] + 2 * np.sum(y[1:-1]) + y[-1])

def romberg(a, b, func, eps, max_iter=100):
    """
    龙贝格求积算法
    求函数func在区间[a,b]上的积分值
    eps:误差
    max_iter:最大迭代上限,应该大于等于2
    """
    previous = [trapezoid(a, b, 1, func)]
    for i in range(1, max_iter):
        current = [trapezoid(a, b, 2 ** i, func)]
        for k in range(1, i + 1):
            tmp = ((4 ** k) * current[k - 1] - previous[k - 1]) / (4 ** k - 1)
            current.append(tmp)
        if np.abs(current[-1] - previous[-1]) < eps:
            return current[-1]
        previous = current
    return previous[-1]

if __name__ == '__main__':
    # x^2+x^3+exp(x)在[0,2]上的积分值:13.055722765711728
    print(
        romberg(0, 2, lambda x: x ** 2 + x ** 3 + np.exp(x), 1e-5)
    )

原文地址:https://www.cnblogs.com/philolif/p/romberg.html

时间: 2024-10-31 20:51:43

龙贝格求积算法的相关文章

龙贝格算法

求积分的龙贝格算法 计算f(x)=1/x在[1,3]上的积分: 1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 6 double f(double x){ 7 return 1.0/x; 8 } 9 10 int main(){ 11 double a,b;//积分区间的上界和下届 12 a=1; 13 b=3; 14 15 double t[1

【C/C++】实现龙贝格算法

1. 复化梯形法公式以及递推化 复化梯形法是一种有效改善求积公式精度的方法.将[a,b]区间n等分,步长h = (b-a)/n,分点xk = a + kh.复化求积公式就是将这n等分的每一个小区间进行常规的梯形法求积,再将这n的小区间累加求和. 公式如下: 使用复化梯形法积分时,可以将此过程递推化,以更方便的使用计算机实现.设积分区间[a,b],将此区间n等分,则等分点共有n+1个,使用复化梯形积分求得Tn.进行二分,二分结果记为T2n,则有: 2. 龙贝格积分公式 龙贝格积分实际上是提高收敛速

数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)

----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接copy ··复合抛物线公式: ··龙贝格公式: 四.实验内容 ------1 实验题目1中所用到的三种算法的matlab实现代码具体如下: %复合梯形公式 function y=funct(f,n,a,b) fi=f(a)+f(b); h=(b-a)/n; d=1; for i=1:n-1 x=a+i*h; fi=fi+2*f(x); d=d+1; end f4=h/2*fi,d %

龙贝格公式计算定积分

1 #include<stdio.h> 2 #include<math.h> 3 #define maxlen 100 4 #define eps 0.5*1e-5 5 double a=0; 6 double b=1; 7 double f(double x){ 8 return 4/(1+x*x); 9 } 10 double t(int n){ 11 int i; 12 double sum, h = (b - a) / n; 13 for (i = 1; i < n;

C# “贝格尔”编排法

采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边:后一半的数自下而上写在右边,然后用横线把相对的号数连接起来.这即是第一轮的比赛. 第二轮将第一轮右上角的编号(“0”或最大的一个代号数)移到左角上,三轮又移到右角上,以此类推. 即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角.如下表示: 7个队比赛的编排方法 第一轮    第二轮   第三轮   第四轮    第五轮   第六轮  

数值分析课程设计

数值分析学习心得: 插值法:拉格朗日插值,埃米特插值 函数逼近:最小二乘法 求积分的算法:牛顿-科斯特公式,龙贝格求积公式,高斯求积公式 求线性方程组的迭代法:jacobi迭代法,高斯-赛德尔迭代法 求非线性方程的算法:牛顿法 求常微分方程初值问题的算法:欧拉法,龙格-库塔法 数值分析课程设计  浙江大学 陈越 第1章 数值分析课程实践概要1.1 课程实践的意义1.2 实验的基本要求第2章 MATLAB简介2.1 MATLAB概述2.2 常用基本指令2.3 数值技术第3章 案例详解1:误差的影响

实验三 数值积分(android)

实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 一.实验内容 分别写出变步长梯形法和romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题. 试验中以下列数据验证程序的正确性. 求  (sinx)/x的积分,积

计算方法(二)数值积分

在工程中,经常会遇到积分问题,这时原函数往往都是找不到的,因此就需要用计算方法的数值积分来求. public class Integral { /// <summary> /// 梯形公式 /// </summary> /// <param name="fun">被积函数</param> /// <param name="up">积分上限</param> /// <param name=&

2018-01-24小结

画了很长时间搞懂常见的灰色模型,以及如何求解.数值计算是一门强大的学科,尤其是结合计算机计算软件(Python,Matlab).灰色模型中的微分方程求解,涉及数值积分,梯形公式.辛普森公式,继续是复化梯形公式.复化辛普森公式,龙贝格公式(外推),控制误差 全排列算法 无重复元素: 递归实现: (1)任取一个元素放在第一个位置,有n种 (2)剩下的n-1个元素,全排列 (3)直到最后一个元素 递归实现:需要消耗大量栈空间 重复: 交换时,如果有交换后效果相同,则重复.方法:排序, #include