Files
AutomaticDifferentiation/tests/test_forward.cpp
2026-04-07 17:16:29 +08:00

47 lines
1.7 KiB
C++

#include <iostream>
#include "forwardad.hpp"
// 一阶前向自动微分测试函数
forwardad::Dual f1(forwardad::Dual x) {
return x + x*x + pow(x,3);
}
// 二阶前向自动微分测试函数
forwardad::Dual g1(forwardad::Dual x, forwardad::Dual y) {
return exp(x) * log(y);
}
// 高阶前向自动微分测试函数
forwardad::Dual h1(forwardad::Dual x, forwardad::Dual y, forwardad::Dual z) {
return pow(x, 3) + pow(y, 2) + z + cos(x * y * z);
}
int test_forward_ad() {
std::cout << "Testing f(x) = x^2 + sin(x) at x=2.0\n";
auto r = forwardad::diff(f1, 2.0);
std::cout << "value = " << r.value << "\n";
std::cout << "grad = " << r.gradient[0] << "\n";
std::cout << "div = " << r.divergence << "\n";
std::cout << "curl = " << r.curl[0] << "\n";
std::cout << "\nTesting g(x,y) = exp(x)*log(y) at (x,y)=(1.0, 2.0)\n";
auto r2 = forwardad::diff(g1, 1.0, 2.0);
std::cout << "value = " << r2.value << "\n";
std::cout << "grad = (" << r2.gradient[0] << ", " << r2.gradient[1] << ")\n";
std::cout << "div = " << r2.divergence << "\n";
std::cout << "curl = (" << r2.curl[0] << ", " << r2.curl[1] << ")\n";
std::cout << "\nTesting h(x,y,z) = x^3 + y^2 + z + cos(x*y*z) at (x,y,z)=(1.0, 2.0, 3.0)\n";
auto r3 = forwardad::diff(h1, 1.0, 2.0, 3.0);
std::cout << "value = " << r3.value << "\n";
std::cout << "grad = (" << r3.gradient[0] << ", " << r3.gradient[1] << ", " << r3.gradient[2] << ")\n";
std::cout << "div = " << r3.divergence << "\n";
std::cout << "curl = (" << r3.curl[0] << ", " << r3.curl[1] << ", " << r3.curl[2] << ")\n";
return 0;
}
int main() {
std::cout << "=== Forward AD Tests ===\n";
test_forward_ad();
return 0;
}