MATLAB 的开源自动微分?

计算科学 matlab 图书馆 自动分化
2021-12-14 00:38:47

是否有任何适用于 MATLAB 的开源自动微分库?

我知道诸如Tomlab/MAD和大量 C++ 库之类的商业包,但是除了Matlab File Exchange 上的 Matlab 包的自动微分(不是主要包)之外,我找不到更多的 MATLAB包。

添加

作为最基本的功能,我需要能够将向量作为变量处理。例如,在那个 MathWorks 包中,我引用了一个测试用例:

val = [1 2 3]; %Some value
x = myAD(val); %Creates a vector with that value.

x .* [4 5 6]; %This should give the derivatives [4; 5; 6]
x_inner = sum(x.* x);% To get the inner product.  The derivative here is [2 4 6] here
%Ideally, the above would simply be x_inner = x * x'
4个回答

SINTEF Matlab Reservoir Simulation Toolbox包括一个 GPL 许可的 AD 库该用法主要针对地下流动中的数值应用,但该库本身可用于更一般的目的。

这是您的示例的基本运行,因为您将从 MRST 的基本目录运行它:

startup;
% Load ad based module
mrstModule add ad-fi


val = [1; 2; 3];
x = initVariablesADI(val);
y = x.*[4; 5; 6];
disp 'Jacobian:'
full(y.jac{1})

z = sum(x.*x);
disp 'Jacobian:'
full(z.jac{1})
Jacobian:

% MRST AD also supports multiple vector valued functions
a = ones(5, 1);
b = ones(5, 1);
[a, b] = initVariablesADI(a, b);
c = a.*b + 2.*b;
full(c.jac{1})
full(c.jac{2})

网站上有一个正在进行中的用户指南,其中第 7 章介绍了 AD 库的一些用法。该库主要针对需要所有雅可比值的问题,并且仅使用前向模式进行矢量化。它确实包含了一些不错的东西,比如 2d 表格插值等等。它已用于解决中等规模的非线性问题(大约 500,000 个未知数)。

目前,非线性求解器和组件主要集中在油藏应用上。库的这一部分目前正在重写,将来可能在这个特定领域之外有一些用途。但是,如果只需要 AD 部分,ADI 类和 initVariablesADI 函数应该就足够了。

免责声明:我是该研究小组的开发人员之一。

SIAM Review 中的这篇文章介绍了如何在 MATLAB 中实现算子重载自动微分,并对该技术进行了很好的介绍。

我意识到这是一个老问题,但是今天自己寻找这个问题时,我发现了 ADiGator,它是开源的,并且似乎可以处理向量。我自己还没有测试过它,但它似乎正在积极开发中。

如果您真的对开源感兴趣并喜欢推广/支持它,那么您可能应该看看开源 matlab clone octave它有一个扩展,称为广告,支持自动前向微分。不幸的是,它目前似乎没有维护。