2010-07-05 8 views
2

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

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

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

будет обработан в 99% случаев, и покрытия на них будет достаточно.

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

ответ

1

Вот еще один подход и в зависимости от того, насколько сумасшедшей может быть ваша функция (см. EDIT), она может дать вам универсальное решение вашей проблемы.

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

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

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

+0

не смог удержаться от желания сказать, что функция должна быть дифференцируемой - есть монстры, которые являются непрерывными, но нигде не дифференцируемыми, http://en.wikipedia.org/wiki/Nowhere_differentiable – Krystian

0

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

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

вам, это где я мог бы добраться до Mathematica (который можно вызывать на Java).

2

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

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

Однако могут быть случаи, когда это действительно возможно. Например, когда вы используете функцию sin (F (x)), вы знаете, что ее диапазон равен [-1,1], независимо от внутренней функции F (x) или когда вы используете Exp (x) диапазон равен (0, + inf).

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

Например, для функции Sin (х) + Exp (х) и х (в -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}.Вам нужно обнаружить и позаботиться о таком поведении, иначе вы получите только верхнюю границу возможного диапазона (такой тип кодомена).

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

@ Высокоэффективный знак: я взглянул на JAS, и кажется, что его основная цель - иметь дело с многомерными кольцами многочленов, но вопрос, упомянутый тригонометрическим, логарифмическим и другим transcendental functions, такой чистой полиномиальной арифметики будет недостаточным.

+0

Вы правы в обозначении, я исправлю это. Что касается алгоритма грубой силы, я имею в виду приближение к определенной точности, мы точно не можем полностью покрывать интервалы. А об алгоритме - да, есть много особых дел, которые нужно лечить. Вот почему я ищу готовое решение, когда кто-то проделал всю грязную работу :) Я предлагаю, чтобы я не единственный, кто был заинтересован в решении, поэтому, возможно, они уже есть. Мои функции вводятся пользователем, и я не могу предсказать их сложность. Тем не менее, я полагаю, что в большинстве случаев они очень простые и сложные случаи могут быть пропущены. –

+0

@Dzmitry: CAS обычно может «полностью покрывать интервалы» (выражать их символически с помощью алгебраических выражений на множествах, готовых к оценке при заданной точности и пригодных для определения того, является ли какое-либо заданное число элементом или нет). (примечание: грубая сила! = приближение к определенной точности. brute-force == исчерпывающий поиск пространства решений проблемы) – Unreason

+0

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

Смежные вопросы