Haskell:二元函数求偏导数

Haskell:二元函数求偏导数

问题

对于已知的二元函数f = f(x, y),且有一个对一元函数求导的函数diff = diff(f)可用。

问题:如何利用diff函数求f函数对于第一个、第二个参数的偏导数?

解答

首先确定上面提到函数的函数类型:

f :: Double -> Double -> Double
diff :: (Double -> Double -> Double) -> Double -> Double -> Double
-- (只考虑最简单的情况。因为这篇博文关注点不在实用性。)

我们用partial函数来解决问题,设计其类型如下:

partial :: Bool -> (Double -> Double -> Double) -> Double -> Double -> Double

partial False f返回一个二元函数,为f对第一个参数求导之后得到的函数;partial True ff对第二个参数求导之后得到的函数。

用lambda演算来固定函数的另一个参数,很容易地描述partial

partial False f x0 y0 = (diff (\x -> f x y0)) x0
partial True  f x0 y0 = (diff (\y -> f x0 y)) y0

partial False f为例,解释上述的声明:通过传入参数y0y固定,此时\x -> f x y0是一个一元函数,对其求导得到导函数,再代入x0的值确定函数值。partial True f也类似。

对上面的描述进行lambda化,得到函数定义(为了方便看,加了括号):

partial False f = \x0 -> (\y0 -> (diff (\x -> f x y0) x0))
partial True  f = \x0 -> (\y0 -> (diff (\y -> f x0 y) y0))

思考1:化简

   partial True f
 = \x0 -> (\y0 -> (diff (\y -> f x0 y) y0))
 = \x0 -> (diff (\y -> f x0 y))
 = \x0 -> (diff (f x0))
 = \x0 -> (diff . f) x0
 = diff . f

原本以为很有启发性,可能可以和Zipper和类型求导关联起来,然而推出来后发现只是一个简单的函数复合:f x提供了一个一元函数,而diff对这个一元函数进行了求导,并没有什么深刻的本质。顿时觉得没什么意思了。

思考2:换元

rev_xy函数:

rev_xy :: (Double -> Double -> Double) -> Double -> Double -> Double
rev_xy f = \y -> \x -> f x y
-- rev_xy f y x = f x y

则有

   partial False f
 = rev_xy (partial True (rev_xy f))
 = rev_xy (diff . (rev_xy f))

依然没有什么启发性的东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值