首页/文章/ 详情

函数式编程计算数值积分

29天前浏览1352

以函数式编程方式,计算数值积分。

 定积分的定义点击这里:定积分的精确定义

下面以定积分

 

为例,展示过程。

如图所示,将积分区间6等分,每一个子区间长度为0.5,则数值积分值为

最终结果与精确值的误差为    

python代码

steps = 6#积分区间六等分
a = 0.0
b = 3.0
dx = (b-a)/steps  #每个子区间长度
f = lambda x: x**3 - 6*x #积分函数
#构造{0,1,2,3,4,5}
r = range(steps) 
#{0,1,2,3,4,5}映射成为{0.5,1.0,1.5,2.0,2.5,3}
map_r1 = map(lambda x: (x+1)*dx, r) 
# 子区间右端点函数值,即每个矩形的高度
map_h = map(f, map_r1)
int = dx * sum(map_h)
print(int)

如果将积分区间500等分,计算结果为-6.723,相对误差为    

Python代码:

steps = 500#积分区间500等分
a = 0.0
b = 3.0
dx = (b-a)/steps  #每个子区间长度
f = lambda x: x**3 - 6*x #积分函数
#构造{0,1,2,3,4,5,...,500}
r = range(steps) 
map_r1 = map(lambda x: (x+1)*dx, r) 
# 子区间右端点函数值,即每个矩形的高度
map_h = map(f, map_r1)
int = dx * sum(map_h)
print(int)

采用同样思路的C++代码(需要支持C++20标准的编译器)

#include<iostream>
#include<ranges>
#include<numeric>
usingnamespacestd::ranges::views;
intmain(){   
constexprauto steps {500} ;
constexprauto a {0.0};
constexprauto b {3.0};
constexprauto dx { (b-a)/steps }; // 
constexprauto f_cubic = [](double x){return x*(x*x) - 6*x;};
constexprauto r_int {iota(0, steps)} ; // 
constexprauto r_pos {r_int | transform([dx](int i){return dx*(0.5 + i);}) }; 
constexprauto r_cubic{ r_pos | transform(f_cubic)} ; 
// 
constexprauto res {dx* std::accumulate(r_cubic.begin(), r_cubic.end(), 0.0)
// 
std::cout << "积分结果为:" << res << std::endl;
}
来源:数值分析与有限元编程
STEPSpythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:29天前
太白金星
本科 慢慢来
获赞 2粉丝 4文章 283课程 0
点赞
收藏

作者推荐

未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈