首页 > 解决方案 > 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();
    }
}

是程序所需的“产品”、“窦”等部分。我的问题是我不知道这应该如何工作,因为这些函数是一种抽象的(因为未知的 x),并且接口中的差异方法返回另一个我猜对我没有意义的接口。我是一名新程序员,希望在这里得到一些帮助。非常感谢!

标签: javainterfacepolymorphismdifferential-equations

解决方案


如果从字面上理解这项任务,您将需要编写一个表达式解析器,该解析器接受一个类似的字符串"2*sin(x)-5"并将其转换为组成的调用

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

其中F是工厂类(或模块)的一个实例,其中每个调用都返回Function相应抽象函数或操作的接口实现。(通过工厂进行操作允许簿记操作,例如检查重复的表达式。)

因此,例如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)

在最低级别,您需要在评估中掉头,这可以使用 with 的子类明智地VariableX完成Function

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

推荐阅读