Примечание: я предполагаю, что вы хотите найти диапазон функции, то есть набор значений, которые может принимать функция.
Я думаю, что эта проблема не простая. Я не думаю, что «грубая сила» вообще является решением, что означает «грубая сила», даже когда у нас есть непрерывные интервалы (то есть бесконечно много точек!).
Однако в некоторых особых случаях это возможно. Например, когда вы берете функцию sin (F (x)) , вы знаете, что ее диапазон равен [-1,1], независимо от внутренней функции F (x) или когда вы берете Exp ( х) вы знаете, что диапазон (0, + инф).
Вы можете попытаться создать синтаксическое дерево с информацией о диапазонах, связанных с каждым узлом. Затем вы можете попытаться пойти снизу вверх по дереву, чтобы попытаться вычислить информацию о фактических интервалах, в которых лежат значения функций.
Например, для функции Sin (x) + Exp (x) и x in (-inf, + inf) вы получите дерево
+ range: [left range] union [right range]
/ \
sin exp range [-1, 1] , range: (0,+inf)
| |
x x
поэтому здесь результатом будет [-1, 1] union (0, + inf) = [-1, + inf).
Конечно, есть много проблем с этим подходом, например, операция над диапазонами для + не всегда является объединением. Скажем, у вас есть две функции F (x) = Sin (x) и G (x) = 1-Sin (x). Оба имеют диапазоны [-1,1], но их сумма уменьшается до {1}. Вы должны обнаружить и позаботиться о таком поведении, в противном случае вы получите только верхнюю границу возможного диапазона (таким образом, кодомен).
Если вы предоставите больше примеров, может быть, кто-то может предложить лучшее решение, я думаю, многое зависит от деталей функций.
@ High Performance Mark: Я посмотрел на JAS, и кажется, что его основная цель - иметь дело с многомерными полиномиальными кольцами, но в вопросе упоминаются тригонометрические, логарифмические и другие трансцендентные функции настолько чистая полиномиальная арифметика не будет достаточно.