#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); ]