首页/文章/ 详情

函数式编程计算数值积分

7月前浏览8722

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

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

下面以定积分

 

为例,展示过程。

 

如图所示,将积分区间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>

using namespace std::ranges::views;

int main(){   
    constexpr auto steps {500} ;
    constexpr auto a {0.0};
    constexpr auto b {3.0};
    constexpr auto dx { (b-a)/steps }; // 
    constexpr auto f_cubic = [](double x){return x*(x*x) - 6*x;};
    
    constexpr auto r_int {iota(0, steps)} ; // 
    constexpr auto r_pos {r_int | transform([dx](int i){return dx*(0.5 + i);}) }; 
    
    constexpr auto r_cubic{ r_pos | transform(f_cubic)} ; 
    // 
    constexpr auto res {dx* std::accumulate(r_cubic.begin(), r_cubic.end(), 0.0)
    // 
    std::cout << "积分结果为:" << res << std::endl;
}


来源:数值分析与有限元编程
STEPSpythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 10文章 322课程 0
点赞
收藏
作者推荐

Python的range和map函数

函数式编程(Functional programming)是一种编程范式,目前没有统一的定义。对于并发编程有广泛应用。Python中,range,map,filter,zip等属于函数式编程。首先要明确一个概念--可迭代对象。列表、字典、range等都是可迭代对象(Iterables)。numbers = [101, 2, 3, 42]for num in numbers: print(num) range它返回一个range对象,该对象提供“查看特定数字序列的机会”(the opportunity to go overthe specific series of numbers),而不实际创建数字列表。获取一个对象而不是整个列表有很多优点。体现了惰性求值的特点。调用方法:range(start, end, step)range(start, end) - 步长step 默认为1range(end) - 起始默认为 0, 步长step 默认为1在下一个示例中,我们将看到range函数返回的对象需要多少内存,以及需要多少内存才能拥有相应的数字列表。现在让我们看看如何使用它:import sysrng = range(3, 22, 2) #rng 是rang型对象# list将 rng 对象转换成列表形式list_rng = list(rng) print(rng)# 输出 rng 对象的地址: &lt;map object at 0x000000265AA67F350&gt;print(list_rng)#输出[3,5,7,9,11,13,15,17,19,21]print(sys.getsizeof(rng))# 输出 rng 对象的大小为48 bytesprint(sys.getsizeof(list_rng))# 输出 list_rng 对象的大小为136 bytes range对象仅为48 bytes,而且是固定的。mapmap(func,seq)函数接收两个参数,一个是函数,一个是Iterable(可迭代对象,序列),map将传入的函数func()依次作用到序列seq的每个元素,并把结果作为新的Iterator(迭代器)返回,之后可转为lis或其他类型输出。注意:这里每个元素都有相同的操作要做。调用方法:map(function, iterable, ...)def double(n): return 2 * nnum = [1, 2, 3, 4, 5, 6, 7, 8]mp = map(double, num) #mp 是map型对象print(mp)# 输出mp对象的地址: &lt;map object at 0x000000265AA67F400&gt; 可以用list将mp对象转换成列表形式:import sysdef double(n): return 2 * nnum = [1, 2, 3, 4, 5, 6, 7, 8]mp = map(double, num) #mp 是map型对象list_mp = list(mp) # list将mp对象转换成列表形式print(list_mp )# 输出[2,4,6,8,10,12,14,16]print( sys.getsizeof(mp) )# 输出mp对象的大小为48 bytesprint( sys.getsizeof(list_mp) )# 输出list_mp对象的大小为120 bytes来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈