2

У меня проблема с использованием математической библиотеки apache commons.
Я просто хочу, чтобы создать функции, такие как F (X) = 4x^2 + 2x, и я хочу, чтобы вычислить производную этой функции
-> е '(х) = 8х + 2
Java - вычисление дериваций с использованием Apache Commons Mathematic Library

Я прочитал статья о Дифференциации (http://commons.apache.org/proper/commons-math/userguide/analysis.html, раздел 4.7).
Существует пример, который я не понимаю:

int params = 1; 
int order = 3; 
double xRealValue = 2.5; 
DerivativeStructure x = new DerivativeStructure(params, order, 0, xRealValue); 
DerivativeStructure y = f(x);     //COMPILE ERROR 
System.out.println("y = " + y.getValue(); 
System.out.println("y' = " + y.getPartialDerivative(1); 
System.out.println("y'' = " + y.getPartialDerivative(2); 
System.out.println("y''' = " + y.getPartialDerivative(3); 

В строке 5 ошибка компиляции происходит, конечно. Функция f(x) вызывается и не определена. Что я ошибаюсь?
Есть ли у кого-нибудь опыт с дифференциацией/деривацией с математической библиотекой apache commons или кто-нибудь знает другую библиотеку/структуру, которая может мне помочь?

Благодаря

+0

Это, вероятно, потому, что метода 'f' и переменной' x' не существует. –

+1

Ya метод не существует, но это пример на веб-сайте apache commons math. Какова их цель? Чтобы показать пример, когда используемая функция не определена? –

ответ

2

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

Существует несколько способов, которыми пользователь может создать реализацию интерфейса UnivariateDifferentiableFunction. Первый метод состоит в том, чтобы просто написать его напрямую, используя соответствующие методы из DerivativeStructure для вычисления сложения, вычитания, синуса, косинуса ... Это часто довольно сложно, и нет необходимости запоминать правила для дифференциации: пользовательский код представляет только самой функции, дифференциалы будут вычисляться автоматически под капотом. Второй способ - написать классическую UnivariateFunction и передать ее в существующую реализацию интерфейса UnivariateFunctionDifferentiator для получения дифференцированной версии той же функции. Первый метод больше подходит для небольших функций, для которых пользователь уже контролирует весь базовый код. Второй метод больше подходит для больших функций, которые громоздки для записи с использованием API DerivativeStructure или функций, для которых пользователь не имеет контроля над полным базовым кодом (например, функциями, вызывающими внешние библиотеки).

Используйте первую идею.

// Function of 1 variable, keep track of 3 derivatives with respect to that variable, 
// use 2.5 as the current value. Basically, the identity function. 
DerivativeStructure x = new DerivativeStructure(1, 3, 0, 2.5); 
// Basically, x --> x^2. 
DerivativeStructure x2 = x.pow(2); 
//Linear combination: y = 4x^2 + 2x 
DerivativeStructure y = new DerivativeStructure(4.0, x2, 2.0, x); 
System.out.println("y = " + y.getValue()); 
System.out.println("y' = " + y.getPartialDerivative(1)); 
System.out.println("y'' = " + y.getPartialDerivative(2)); 
System.out.println("y''' = " + y.getPartialDerivative(3)); 
+0

Спасибо большое :) Теперь становится ясно –

+0

Commons-math имеет более простые способы создания математических функций, но 'DerivativeStructure' - это способ получить производные. Да, я знаю, что документация довольно непрозрачна. –

+0

Интересно, кто придумал этот способ дифференциации? Не математик или физик. – Aksakal

3

В следующем thread from the Apache mailing list, кажется, иллюстрируют два возможных способа, как может быть определена производная UnivariateDifferentiableFunction. Я добавляю новый ответ, поскольку я не могу прокомментировать предыдущий (недостаточная репутация).

Используемая спецификация образца функции f (x) = x^2.

(1) Использование DerivativeStructure:

public DerivativeStructure value(DerivativeStructure t) { 
    return t.multiply(t); 
} 

(2) При написании классической UnivariateFunction:

public UnivariateRealFunction derivative() { 
    return new UnivariateRealFunction() { 
      public double value(double x) { 
       // example derivative 
       return 2.*x; 
      } 
    } 
} 

Если я хорошо понимаю, преимущество в первом случае является то, что производная делает не нужно получать вручную, как во втором случае. В случае, если известна производная, не должно быть никакого преимущества определять производную структуру, верно? Приложение, которое я имею в виду, относится к решателю Ньютона-Рафсона, для которого обычно нужно знать значение функции и ее производную.

Полный пример представлен на вышеупомянутом веб-сайте (авторы - Томас Нейдхарт и Франц Саймонс). Любые дальнейшие комментарии приветствуются!

+1

Во втором решении могут быть две проблемы: (i) Класс «UnivariateRealFunction», по-видимому, заменен на «UnivariateFunction» в текущей версии math3. (ii) Может отсутствовать точка с запятой, закрывающая вторую пару скобок. – Unis

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

  • Нет связанных вопросов^_^