Возникла такая задача.
Есть функция, зависящая от нескольких параметров. Значение этой функции — вектор (то есть несколько чисел).
f: R^m -> R^n
Задача состоит в том, чтобы решить уравнение f(x) = v, где v — заданный вектор из пространства R^n, x — вектор из пространства R^m. То есть найти координаты вектора x. Характер функции f позволяет с уверенностью утверждать, что такое решение есть.
Вот какой метод я вижу.
Обозначим f(x) = u. И рассмотрим новую функцию "отклонение f(x) от v", значение которой уже просто число.
r: R^m -> R
r = |f(x) - v| = |u - v| = (u1 - v1)^2 + (u2 - v2)^2 + ... + (un - vn)^2
Таким образом, возникает новая задача — найти решение уравнения r(x) = 0 (или найти точку минимума r(x), что, в данном случае, одно и то же).
И возникает вопрос — как решать уравнение r(x) = 0? Или находить точку минимума функции r(x)? При этом очень важно минимизировать количество вызовов функции r(x), т.к. функция f(x) вычисляется очень долго.
1) Если решать уравнение r(x) = 0, то хотелось бы, чтобы алгоритм использовал дополнительную информацию о r(x) — то, что r(x) >= 0 всегда.
2) Если находить точку минимума функции r(x), то хотелось бы, чтобы алгоритм использовал ту информацию, что минимум нам уже известен — это 0.
Пока что я находил точку минимума r(x) методом powell (нашёл только
такую ссылку). Но этот метод никак не использует информацию о том, что минимум функции равен 0. И из-за этого, делает большое количество вызовов функции, которых, в принципе можно избежать.
Дополнительная информация.
Значение градиента f(x) аналитически задать невозможно. Можно только примерно вычислять — функция f(x) довольно гладкая.