chore: 添加散度

This commit is contained in:
mayge
2026-04-07 17:16:29 +08:00
parent 40feeabb79
commit 11e97c545a
5 changed files with 44 additions and 0 deletions

View File

@@ -51,6 +51,17 @@ ADResult diff(const Func f, Args... args) {
for (auto& in : inputs)
res.gradient.push_back(in.gradient());
// 散度
res.divergence = 0.0;
for (const auto& g : res.gradient) res.divergence += g;
// 旋度
// 标量场的旋度始终为0
res.curl.resize(inputs.size());
for (size_t i = 0; i < inputs.size(); ++i) {
res.curl[i] = 0.0; // 标量场的旋度为0
}
return res;
}
} // namespace backwardad

View File

@@ -18,6 +18,8 @@ ADResult diff(const Func& f, Args... args) {
// 2. 对每个输入变量求偏导seed 依次设为 1
double args_arr[] = { (double)args... };
// 梯度
[&]<size_t... Is>(std::index_sequence<Is...>) {
([&]() {
// 创建 Dual 输入,第 Is 个变量导数=1其余=0
@@ -31,6 +33,22 @@ ADResult diff(const Func& f, Args... args) {
}(), ...);
}(std::make_index_sequence<N>{});
// 散度
res.divergence = 0.0;
[&]<size_t... Is>(std::index_sequence<Is...>) {
([&]() {
res.divergence += [&]<size_t... Js>(std::index_sequence<Js...>) {
return res.gradient[Is]; // 这里直接用梯度值,因为散度是梯度的和
}(std::make_index_sequence<N>{});
}(), ...);
}(std::make_index_sequence<N>{});
// 旋度
// 标量场的旋度始终为0
res.curl.resize(N);
for (size_t i = 0; i < N; ++i) {
res.curl[i] = 0.0; // 标量场的旋度为0
}
return res;
}
} // namespace forwardad

View File

@@ -6,4 +6,6 @@
struct ADResult{
double value; // 函数值
std::vector<double> gradient; // 梯度
std::vector<double> curl; // 旋度
double divergence; // 散度
};