Как найти диапазон функций? - PullRequest
2 голосов
/ 05 июля 2010

У меня есть произвольная функция или неравенство (состоящее из ряда тригонометрических, логарифмических, экспоненциальных и арифметических членов), которое принимает несколько аргументов, и я хочу получить его диапазон, зная домены всех аргументов. Существуют ли библиотеки Java, которые могут помочь решить проблему? Каковы лучшие практики для этого? Прав ли я, что для произвольной функции единственное, что можно сделать, - это приближение методом грубой силы? Также меня интересуют функции, которые могут создавать пересечения и дополнения для заданных доменов.

Upd. Функции вводятся пользователем, поэтому сложность не может быть предсказана. Однако если библиотека будет обрабатывать хотя бы простые случаи (1-2 переменные, 1-2 условия), все будет в порядке. Я полагаю, что функции будут в основном определять интервалы и содержать не более 2 независимых переменных. Например, такие определения, как

y >  (x+3), x ∈ [-7;8]
y <= 2x, x ∈ [-∞; ∞]
y =  x, x ∈ {1,2,3}

будет лечиться в 99% случаев, и на данный момент их достаточно.

Ну, может быть, быстрее написать простой метод обработки таких случаев. Вероятно, это будет удовлетворительно для моего случая, но если есть лучшие варианты, я бы хотел их изучить.

Ответы [ 3 ]

2 голосов
/ 05 июля 2010

Примечание: я предполагаю, что вы хотите найти диапазон функции, то есть набор значений, которые может принимать функция.

Я думаю, что эта проблема не простая. Я не думаю, что «грубая сила» вообще является решением, что означает «грубая сила», даже когда у нас есть непрерывные интервалы (то есть бесконечно много точек!).

Однако в некоторых особых случаях это возможно. Например, когда вы берете функцию 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, и кажется, что его основная цель - иметь дело с многомерными полиномиальными кольцами, но в вопросе упоминаются тригонометрические, логарифмические и другие трансцендентные функции настолько чистая полиномиальная арифметика не будет достаточно.

1 голос
/ 05 июля 2010

Вот другой подход, и в зависимости от того, насколько сумасшедшей может быть ваша функция (см. РЕДАКТИРОВАТЬ), она может дать вам универсальное решение вашей проблемы.

  1. Составьте последнее выражение, которое может быть довольно сложным.

  2. После этого используйте численные методы , чтобы найти минимум и максимум функции - это должно дать вам результирующий диапазон.

РЕДАКТИРОВАТЬ : Только в том случае, если ваше окончательное выражение не является непрерывным, вышеприведенное не сработает, и вам придется разделить на непрерывные разделы, для каждого из которых вам нужно будет найти мин и макс. В конце вы должны объединить тех.

0 голосов
/ 05 июля 2010

Я бы подумал, что это естественная проблема для решения системы компьютерной алгебры.Я погуглил, и JAS кажется наиболее цитируемым Java CAS.

Если бы мне пришлось ограничить myelf числовыми подходами, то я бы, вероятно, занялся бы этим с помощью различных интервальных вычислений,Итак, кодомен греха - это [-1,1], кодомен домена exp - (0, + Inf), а кодомен домена exp (sin (выражение)) - ...

для васвот где я бы достиг Mathematica (который вызывается из Java).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...