2013-04-14 3 views
2

Я ищу простой способ выполнить на Java то, что делает fminsearch() MATLAB. Мне не нужно быть таким же общим, как fminsearch, в моем случае я хочу только найти минимум (минимум функций и параметров) нелинейной функции с одной переменной. Я не знаю аналитического выражения функции, но могу легко оценить ее.Минимальный поиск для одномерной нелинейной функции в Java

Знаете ли вы о библиотеке, которая выполняет это, или о простом алгоритме, который я мог бы повторно реализовать?

Примечание: Я видел, что общая математика Apache имеет что-то вроде этого (UnivariateOptimizer), но большинство методов кажутся устаревшими, и я не мог найти хорошего объяснения, как его использовать. Любые советы, связанные с этим, также приветствуются.

Спасибо!

+0

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

+1

Я думаю, что Apache Commons Math - хорошее место для начала. Вы все равно должны иметь возможность использовать устаревшие пакеты. Однако я считаю, что новая разработка продолжается в недавно добавленных пакетах; например, одномерная оптимизация теперь находится в пакете * org.apache.commons.math3.optim.univariate *. –

ответ

4

Apache Commons Math, как правило, является хорошим местом для численных вычислений на Java. Использование лучше всего изучается на примере, глядя на API documentation и unit test source code для различных классов и методов.

Классы оптимизации, на которые ссылаются в user guide, как вы уже отмечали, устарели. Их все еще можно назвать, но в конечном итоге они, конечно, будут выведены из библиотеки. По неизвестным мне причинам постоянная оптимизация в настоящее время происходит в оптимизированном, а не на оптимизация подпакет.

Для однофакторного функции (локальная) оптимальной минимизации, Apache Commons Math обеспечивает реализацию методаBrent. Использование изложена в unit tests в BrentOptimizer, из которого я скопировал этот отрывок:

@Test 
public void testSinMin() { 
    UnivariateFunction f = new Sin(); 
    UnivariateOptimizer optimizer = new BrentOptimizer(1e-10, 1e-14); 

    Assert.assertEquals(3 * Math.PI/2, 
     optimizer.optimize(new MaxEval(200), 
          new UnivariateObjectiveFunction(f), 
          GoalType.MINIMIZE, 
          new SearchInterval(4, 5)).getPoint(), 1e-8); 

    Assert.assertTrue(optimizer.getEvaluations() <= 50); 
    Assert.assertEquals(200, optimizer.getMaxEvaluations()); 
    ... 
} 
+0

Это было очень полезно, спасибо большое. – Virginie