当前位置: 首页 > news >正文

C++实现自动微分:从DualNumber到运算符重载

从零构建C++自动微分库:实现Dual Number与运算符重载

自动微分通过**双数(Dual Number)**实现,其形式为 $a + b\epsilon$,其中 $\epsilon^2=0$($\epsilon \neq 0$)。实数部分存储函数值,无穷小部分存储导数。

步骤1:定义Dual类
#include <cmath> class Dual { public: double val; // 实部(函数值) double der; // 虚部(导数值) // 构造函数 Dual(double v = 0.0, double d = 0.0) : val(v), der(d) {} };
步骤2:重载基本运算符

规则:

  • 加法:$(a + b\epsilon) + (c + d\epsilon) = (a+c) + (b+d)\epsilon$
  • 乘法:$(a + b\epsilon) \times (c + d\epsilon) = ac + (ad + bc)\epsilon$(因 $\epsilon^2=0$)
// 加法重载 Dual operator+(const Dual& lhs, const Dual& rhs) { return Dual(lhs.val + rhs.val, lhs.der + rhs.der); } // 乘法重载 Dual operator*(const Dual& lhs, const Dual& rhs) { return Dual( lhs.val * rhs.val, lhs.val * rhs.der + lhs.der * rhs.val ); } // 减法重载(类似加法) Dual operator-(const Dual& lhs, const Dual& rhs) { return Dual(lhs.val - rhs.val, lhs.der - rhs.der); } // 除法重载:$\frac{a+b\epsilon}{c+d\epsilon} = \frac{a}{c} + \frac{bc-ad}{c^2}\epsilon$ Dual operator/(const Dual& lhs, const Dual& rhs) { return Dual( lhs.val / rhs.val, (lhs.der * rhs.val - lhs.val * rhs.der) / (rhs.val * rhs.val) ); }
步骤3:重载数学函数(链式法则)

规则:$f(a+b\epsilon) = f(a) + f'(a)b\epsilon$

// 正弦函数 Dual sin(const Dual& x) { return Dual(std::sin(x.val), std::cos(x.val) * x.der); } // 指数函数 Dual exp(const Dual& x) { double exp_val = std::exp(x.val); return Dual(exp_val, exp_val * x.der); } // 幂函数(以e为底) Dual pow(const Dual& base, double exponent) { double pow_val = std::pow(base.val, exponent); return Dual(pow_val, exponent * pow_val / base.val * base.der); }
步骤4:使用示例

计算 $f(x) = x^2 + \sin(x)$ 在 $x=2$ 处的值和导数:

int main() { Dual x(2.0, 1.0); // 初始值x=2, 导数为1(对x求导) Dual result = pow(x, 2) + sin(x); std::cout << "f(2) = " << result.val << "\n"; // 输出: 4 + sin(2) std::cout << "f'(2) = " << result.der << "\n"; // 输出: 4 + cos(2) return 0; }
关键原理
  1. 双数结构:$a + b\epsilon$ 同时存储值和导数
  2. 运算符重载:通过 $\epsilon^2=0$ 的代数规则实现自动微分
  3. 链式法则:数学函数中隐式应用 $\frac{df}{dx} = f'(x) \cdot g'(x)$

此实现支持任意复杂函数的自动微分,只需组合基本运算即可。扩展性可通过添加更多函数重载(如 $\cos$, $\log$)增强。

http://www.jsqmd.com/news/562500/

相关文章:

  • 基于模糊控制的锂电池充放电控制系统设计之旅
  • 有什么好用的服务器性能测试工具
  • 磁盘清理神器Czkawka:开源工具帮你3分钟找回20GB空间
  • STM32 HAL库实战:如何用CubeMX快速配置UART通信(附回调函数示例)
  • Buildroot实战:从零构建定制化嵌入式Linux根文件系统
  • Java+SpringBoot 无人健身房物联网系统完整源码实现
  • vLLM-v0.17.1镜像免配置:SSH直连调试vLLM服务日志与错误排查
  • 从AutoCAD到Web地图:手把手教你用Java把DWG坐标数据导入GeoJSON
  • 老旧Mac升级终极指南:五步让您的设备焕发新生,安装最新macOS系统
  • 终极LrcHelper指南:3分钟掌握网易云音乐双语歌词下载与索尼Walkman适配
  • Phi-3-mini-128k-instruct实战:构建面向中小企业的AI销售话术生成与客户邮件回复助手
  • springboot+vue基于web的网上购物商城系统开发商家
  • 3步重构魔兽世界宏系统:GSE-Advanced-Macro-Compiler技术深度解析
  • AI创业公司生存法则:技术合伙人的视角
  • 8大架构陷阱!90%企业RAG项目效果差,如何才能摆脱“幻觉”与低效?
  • 2026年服务器性能测试工具分类盘点与选型指南
  • 51单片机倒计时器制作全攻略:从Keil5编程到Proteus仿真(附完整代码)
  • Arrow终极指南:5步掌握可视化游戏叙事设计工具
  • Sdcb.PaddleOCR vs PaddleOCRSharp:C# OCR选型实战对比与性能调优心得
  • mPLUG VQA惊艳效果:对抽象画作、信息图表、手绘草图的理解能力呈现
  • 宽带阻抗匹配实战:如何用ADS和Matlab优化你的天线板电路(300MHz~1GHz案例)
  • OpCore Simplify智能配置引擎:黑苹果硬件适配与兼容性解决方案
  • FanControl完全指南:5分钟掌握Windows风扇智能调速终极方案
  • 如何获取2026年服务器性能测试工具相关资讯
  • 告别复杂配置!Nanbeige 4.1-3B极简WebUI单文件运行指南
  • 【UE4】利用varest插件高效解析json数据的蓝图实现(实战指南)
  • 自动驾驶避障算法实战:从动态规划(DP)到模型预测控制(MPC)的Matlab代码详解
  • SpringBoot+MQTT 无人健身房智能管控系统源码实战
  • 如何通过tchMaterial-parser实现国家中小学智慧教育平台电子课本高效获取?
  • 用ESP32S3做个蓝牙小玩意:手把手教你实现Eddystone信标广播(附完整代码)