You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Haskell中使用Numeric.AD库实现Carleman矩阵

使用Haskell Numeric.AD实现可微函数的Carleman矩阵

问题场景

尝试基于Haskell的Numeric.AD库实现可微函数的Carleman矩阵,参考Carleman矩阵的数学定义,但最初编写的代码触发了类型不匹配的编译错误。

最初错误代码示例

import Numeric.AD

carlemanMatrix :: (Num a, Fractional a, Mode t) => Int -> (t a -> t a) -> [[a]]
carlemanMatrix n f = [ [ diff (f^k) 0 | k <- [0..n-1] ] | i <- [0..n-1] ]

这段代码的核心问题是:直接使用f^k进行函数迭代会导致Numeric.AD的模式类型与普通函数迭代的类型无法兼容,编译器无法完成正确的类型推导,从而抛出类型不匹配错误。

修正后的实现代码

单独定义目标可微函数,拆分导数计算逻辑,调整实现思路后得到可正常编译运行的代码:

import Numeric.AD
import Data.List (transpose)

-- 示例可微函数:f(x) = x + x²,可替换为其他可微函数
f :: (Num a, Mode t) => t a -> t a
f x = x + x * x

-- 计算函数g在0点的k阶导数,并除以k!(符合Carleman矩阵元素的数学定义)
derivAt0 :: (Num a, Fractional a, Mode t) => Int -> (t a -> t a) -> a
derivAt0 k g = diffs g 0 !! k / fromIntegral (product [1..k])

-- 构造n阶Carleman矩阵
carlemanMatrix :: (Num a, Fractional a, Mode t) => Int -> [[a]]
carlemanMatrix n = transpose 
  [ [ derivAt0 i (\x -> iterate f x !! j) | i <- [0..n-1] ] 
  | j <- [0..n-1] 
  ]

修正思路说明

  1. 单独定义目标函数:将可微函数f独立提取,明确其类型签名,让Numeric.AD的模式类型(如Reverse、Forward)能正确推导。
  2. 拆分导数计算逻辑:封装derivAt0函数专门处理"0点k阶导数除以k!"的计算,简化主逻辑的类型复杂度。
  3. 显式处理函数迭代:用iterate f x !! j明确生成f的j次迭代函数,避免隐式类型转换带来的冲突,同时通过transpose调整行列顺序以匹配Carleman矩阵的标准定义。

内容的提问来源于stack exchange,提问作者Hermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:13:31