Дифференциальные функции с интерфейсом в Java

#java #interface #polymorphism #differential-equations

#java #интерфейс #полиморфизм #дифференциальные уравнения

Вопрос:

Мне нужно закодировать Java-программу, которая принимает функцию типа f (x) = 2x-5 (но более сложную) и вычисляет f (x) и дифференцирует до f'(x). Для этого я должен реализовать функцию интерфейса:

 public interface Function {
    double evaluate(double x);
    Function differentiate();
}
 

и реализуйте интерфейс в нескольких классах, таких как (пока не корректно):

 public class Constant implements Function {

    private final int FS = 0;

    @Override
    public double evaluate(double n) {
        return n;
    }

    @Override
    public Function differentiate() {
        return this;
    }

    public Constant(double value){
        evaluate(value);
        differentiate();
    }
}
 

это такие части, как «product», «sinus», … которые необходимы для программы.
Моя проблема в том, что я не знаю, как это должно работать, потому что функции являются своего рода абстрактными (из-за неизвестного x), а differenciate-метод в интерфейсе возвращает другой интерфейс, который, я думаю, не имеет для меня значения.
Я новый программист и надеюсь, что здесь вам помогут.
Большое спасибо!

Комментарии:

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

2. @MrLufus Function вопрос не является функциональным интерфейсом.

3. Я знаю, что такое интерфейс и что с его помощью можно реализовать абстрактные методы. Код, который я написал (2-й), был моей попыткой переопределить, но он совершенно неправильный

4. «differenciate-метод в интерфейсе возвращает другой интерфейс» — на самом деле вы не можете вернуть сам интерфейс. Вы вернете некоторый конкретный класс, который реализует этот интерфейс. В вашем случае differentiate() метод Sinus должен возвращать значение Cosinus (которое реализует Funtion интерфейс)

Ответ №1:

Если воспринимать эту задачу буквально, вам нужно будет написать анализатор выражений, который принимает строку like "2*sin(x)-5" и преобразует ее в вызовы, которые составляют сумму

 F.Sum(F.Prod(F.Cons(2),F.Sin(F.VarX)),F.Cons(-5))
 

где F — экземпляр заводского класса (или модуля), где каждый из вызовов возвращает реализацию интерфейса Function для соответствующей абстрактной функции или операции. (Выполнение этого через factory позволяет выполнять операции бухгалтерского учета, такие как проверка на наличие дублированных выражений.)

Так, например Product , в качестве возвращаемого объекта F.Prod будут нужны Function объекты factor1, factor2 в качестве полей-членов, которые инициализируются из аргументов конструктора. Тогда числовая оценка должна выглядеть следующим образом (добавьте обычные украшения для действительного объявления функции)

 evaluate(x) { return factor1.evaluate(x)*factor2.evaluate(x); }
 

и символическая / алгоритмическая производная будет символически реализовывать правило произведения Лейбница

 differentiate() { return Sum(Product(factor1, factor2.differentiate()), Product(factor1.differentiate(),factor2));
 

Как сказано в комментариях, Sine потребуется один Function объект-аргумент в конструкторе и сохраненный как поле-член argument . Тогда численное вычисление и символьное дифференцирование могут выглядеть следующим образом

 evaluate(x) {return Math.sin(argument.evaluate(x)); }
differentiate() { return Product(Cos(argument), argument.differentiate())); }
 

Последнее включает внутреннюю производную по правилу цепочки d/dx(sin(u(x))=cos(u(x))*u'(x) .

На самом низком уровне вам нужно сделать разворот в оценке, это можно сделать разумно, используя VariableX подкласс Function with

 evaluate(x) { return x; }
differentiate { return Constant(1); ]