Я пытаюсь вычислить численный градиент гладкой функции в C++. И значение параметра может меняться от нуля до очень большого числа (возможно, от 1 до 10 ... 1 020)Есть ли «стандартный» способ вычисления численного градиента?
Я использовал функцию f (x, y) = 10 * x^3 + y^3 в качестве тестового стенда, но я что если x или y слишком велико, я не могу получить правильный градиент.
Вот мой код, чтобы вычислить graidient:
#include <iostream>
#include <cmath>
#include <cassert>
using namespace std;
double f(double x, double y)
{
// black box expensive function
return 10 * pow(x, 3) + pow(y, 3);
}
int main()
{
// double x = -5897182590.8347721;
// double y = 269857217.0017581;
double x = 1.13041e+19;
double y = -5.49756e+14;
const double epsi = 1e-4;
double f1 = f(x, y);
double f2 = f(x, y+epsi);
double f3 = f(x, y-epsi);
cout << f1 << endl;
cout << f2 << endl;
cout << f3 << endl;
cout << f1 - f2 << endl; // 0
cout << f2 - f3 << endl; // 0
return 0;
}
Если я использую приведенный выше код для вычисления градиента, градиент будет равен нулю!
Функция testbench, 10 * x^3 + y^3, является просто демо, реальная проблема, которую мне нужно решить, на самом деле является функцией черного ящика.
Итак, есть ли «стандартный» способ вычисления численного градиента?
Вы сделали математику для «_large x и y_» w.r.t. на 'x^3' и' y^3'? Подсказка: 'double' имеет свои пределы. –
Стандартный способ вычисления градиента - это исчисление. Как вы его реализуете, это ваша ответственность. (10^19)^3 = 10^57, правильно? – duffymo
@duffymo это * хорошо * в пределах диапазона 'double' (1e308, ISTR) – Alnitak