haskell - Haskell 中的偏导数

标签 haskell calculus

不久前,一位 friend 想要一个可以使用牛顿法求解函数根的程序的帮助,自然为此我需要一些方法来数值计算函数的导数,这就是我想出的:

deriv f x = (f (x+h) - f x) / h where h = 0.00001

牛顿的方法很容易实现,而且效果很好。但现在我开始怀疑 - 有什么方法可以使用这个函数以数值方式求解偏导数,还是需要一个完整的 CAS?我会发布我的尝试,但我完全不知道该怎么做。

请记住,我是 Haskell 的新手。谢谢!

最佳答案

你当然可以做和你已经实现的一样的事情,只是用多元扰动代替。但首先,正如您应该始终使用顶级函数一样,添加类型签名:

deriv :: (Double -> Double) -> Double -> Double

这可能不是最通用的签名,但可能对您需要的所有内容都足够通用。我会打电话
type ℝ = Double

下面为简洁起见,即
deriv :: (ℝ -> ℝ) -> ℝ -> ℝ

现在你想要的是,例如在ℝ²
grad :: ((ℝ,ℝ) -> ℝ) -> (ℝ,ℝ) -> (ℝ,ℝ)
grad f (x,y) = ((f (x+h,y) - f (x,y)) / h, (f (x,y+h) - f (x,y)) / h)
 where h = 0.00001

不得不单独写出组件并使定义特定于特定维向量空间是很尴尬的。一个 generic way这样做:
import Data.VectorSpace
import Data.Basis

grad :: (HasBasis v, Scalar v ~ ℝ) => (v -> ℝ) -> v -> v
grad f x = recompose [ (e, (f (x ^+^ h*^basisValue b) - f x) ^/ h)
                     | (e,_) <- decompose x ]
 where h = 0.00001

请注意,这种预先选择的步骤-有限微分始终是在高阶项的不准确性和浮点错误之间进行权衡,所以一定要检查自动微分。

关于haskell - Haskell 中的偏导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215783/

相关文章:

haskell - 从 [Maybe Bool] 中获得一个 Bool,该 Bool 保证至少包含一个 Just

haskell - Monad 和计算机程序的结构和解释

typescript - 递归函数中的基本情况不会停止递归 typescript

neural-network - softmax 函数解释的导数

objective-c - 点之间的均匀距离

Haskell 合并多个列表

haskell - Haskell : abort writeFile on error

haskell - 如何使用实例组织 Haskell 模块 : stick to data type vs type class?

javascript slider 加权值

r - 查找向量中值之间的中点