在 c++ 中使用 adolc 作为符号函数

计算科学 C++ 自动分化
2021-12-26 02:44:10

这是使用 Adolc 库进行自动微分的 C++ 中符号函数的实现。

template<class Tdouble> Tdouble sgn(const Tdouble  &x) 
{ 
  Tdouble s_plus, s_minus, half(.5);
  // set s_plus to sign(x)/2,  except for case x == 0, s_plus = -.5 
  condassign(s_plus,  +x, -half, +half);
  // set s_minus to -sign(x)/2, except for case x == 0,s_minus = -.5 
  condassign(s_minus, -x, -half, +half);
  // set s to sign(x)
  return 0.5*(1-(s_plus - s_minus));
}

我的问题是:为什么我们需要计算 s_minus 和 s_plus ?有什么优点?

如果我简单地使用怎么办:

template<class Tdouble> Tdouble sgn(const Tdouble  &x) 
{ 
  Tdouble res;
  condassign(res,x,1,-1);
  return res;
}
1个回答

你确定它应该是签名功能吗?

根据第 1.8 节中的https://projects.coin-or.org/ADOL-C/browser/stable/2.1/ADOL-C/doc/adolc-manual.pdf?format=rawcondassign(a,b,c,d) ,等于

a = (b > 0) ? c : d

所以发布的函数实际上是给 Heaviside 函数而不是符号函数。它实现了这个功能

f(x)={0x<01/2x=01x>0
如果x>0

s_plus = -1/2, s_minus = 1/2, result = 1

如果x=0

s_plus = s_minus = 1/2, result = 1/2

如果x<0

s_plus = 1/2, s_minus = -1/2, result = 0