Представьте, что есть функция, которая оценивает высоту поверхности по координате x и y с плавающей точкой (и дополнительные компоненты в соответствии с размерностью):
double ComputeElevation(double x, double y, ...., double z) { }
Это не аналитическая функция, и поэтому производные не могут быть вычислены. Что мне нужно сделать, так это найти направление, в котором поверхность является самой крутой для любой данной пары {x, y}. Одна оценка может быть очень дорогой (подумайте секунды или даже минуты в худшем случае).
Мой типичный подход в двумерном случае - это выборка поверхности в N местах рядом с {x, y}, затем подгонка кривой по этим выборкам и поиск кривой для самой высокой точки, поскольку этот поиск не страдает дорогая оценка:
На изображении выше P0 - заданная координата. {S0, S1, S2, S3} - это 4 случайно расположенных выборки вокруг P0, а PM - самая высокая точка на кривой. Таким образом, вектор PM-P0 является направлением наискорейшего подъема.
Но я понятия не имею, как масштабировать это до N измерений или есть ли намного более умные алгоритмы для этого.
Число измерений потенциально довольно большое (от десятков до сотен), поэтому любой метод, который я в конечном итоге использую, должен работать, когда выборок меньше, чем измерений. Я не ищу точного ответа, это было бы невозможно, но приличная аппроксимация на полпути уже была бы весьма желательна.
пс. Я делаю это в C #, не то чтобы это имело большое значение, но у меня нет доступа к функциям, не связанным с C #.