首页/文章/ 详情

函数式编程计算微分

8月前浏览7937
  • 高阶函数(higher-order function)

函数本身也可以赋值给变量,例如:

>>> f = abs
>>> f
<built-in function abs>

如果一个变量指向了一个函数,那么,可否通过该变量来调用这个函数?用代码验证一下:

>>> f = abs
>>> f(-1)
1

说明变量f现在已经指向了abs函数本身。

在上一篇提到的map函数的调用方式:map(function, iterable, ...)。可以看到,参数列表中就有函数。filter,reduce等函数与之类似,其参数列表中也有函数。

将其他函数作为参数或者将函数作为结果返回的函数,称为高阶函数。

要计算    的和,我们可以这样编程:

def add(x,y):
    return x + y

reduce(add, [1,2,3,4,5,6] )

reduce的第一个参数是一个函数,第二个参数是一个列表。作为reduce的第一个参数的函数必须接受两个参数并返回单个结果。

正如函数可以作为其他函数的输入参数一样,函数也可以作为其他函数的返回。

def fun(n):
    return lambda x: x**n

这里返回的一个匿名函数。下面来调用这个高阶函数

>>> f = fun(3)
>>> f(2)
8

甚至可以一步到位:

>>> f = fun(3)(2)
8
  • 函数式编程计算微分

函数    的导数定义如下:

 
def Derivative(f, h):
    return lambda x: ( f(x+h) - f(x) ) / h

调用上面的函数求    在    的导数。

value = Derivative(lambda x: x**20.0001) (10)
  • 函数式编程计算n阶导数

利用递归算法计算n阶导数。

def Derivative(f, h):
    return lambda x: ( f(x+h) - f(x) ) / h

def Derivative_n(f, h, n):
    if n == 0:
        return f
    else:
        return Derivative(Derivative_n(f, h, n-1), h)

调用上面的函数求    在    的3阶导数。

value = Derivative_n(lambda x: x**40.00013) (10)


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

函数式编程计算数值积分

以函数式编程方式,计算数值积分。 定积分的定义点击这里:定积分的精确定义下面以定积分 为例,展示过程。 如图所示,将积分区间6等分,每一个子区间长度为0.5,则数值积分值为最终结果与精确值的误差为 python代码steps = 6 #积分区间六等分a = 0.0b = 3.0dx = (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.0b = 3.0dx = (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 &lt;iostream&gt;#include &lt;ranges&gt;#include&lt;numeric&gt;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 &lt;&lt; &quot;积分结果为:&quot; &lt;&lt; res &lt;&lt; std::endl;}来源:数值分析与有限元编程

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