将函数传递给函数java

时间:2017-05-07 11:05:31

标签: java abstract

我正在努力在Java中实现一些基本的计算数学。找到函数f(x)的根的一种方法(其中根是值xi,其中f(xi)= 0)是Newton-Rhapson方法。要在Java中实现,我首先创建了一个基本类(包含Newton-Rhapson方法的类)和函数f(x)的一些定义:

public class CompMaths {

    public double Newton(double x)  {
        //find root of f(x)      
    }

    public double f(double x)  {
         //definition of f(x)
    }

}

这样做,如果我希望这与用户想要的任何f(x)定义兼容,即f(x)= x ^ 2,f(x)= x * sin(x),我必须为f(x)的每个定义创建一个单独的类,它还必须包含Newton-Rhapson方法的定义(以及我需要实现的许多其他comp数学方法)。这似乎有点矫枉过正。此外,它将我的CompMaths类暴露给用户,我不希望这样。相反,能够定义每个函数并将其“传递”即

会很棒
public double Newton(double x, f(x)) ...

这一点,我确信每个人都知道Java不支持。我最初的想法是,如果你传入一个定义为f(x)的对象,那么称之为Func,即

public double Newton(double x,Func func)...

所以最初我认为这不是最好的解决方案,因为我必须为每个不同的Func对象提供多个CompMath定义。这显然是荒谬的,并且只是简单地将问题从之前反转出来。为了克服这个问题,我想,“我想要使用唯一的类定义Func对函数f(x)进行多种不同的定义。而且我想到的一个解决方案是 - 使用抽象方法f(x)使用Func抽象,即< / p>

public abstract class Func {

   public abstract double f(double x);
}

所以现在我只需要为扩展Func的每个函数创建单独的类,并且有自己独立的f(x)定义,f(x)的一些例子,称它们为f1(x)= x ^ 2和f2 (x)= x - sin(x ^ 2)即

public class f1 extends Func {
  @Override 
  public double f(double x) {return x*x;}
}

public class f2 extends Func {
  @Override 
  public double f(double x) { return x - Math.Sin(x*x);}

}

现在,如果我想在牛顿方法中使用f1或f2,我使用

double x1 = 3, x2 = 4;
CompMaths compMaths = new CompMaths();
compMaths.Newton(x1, new f1());
compMaths.Newton(x2, new f2());

这看起来效果非常好(注意 - 可以将Newton定义为静态以避免必须创建CompMaths对象)。用户只需要通过扩展Func并定义自己的f(x)来创建它们的函数。 CompMaths类的任何内容都不会被公开。所以我很高兴,但我绝不认为自己是一个专家,所以我想我会看到人们的想法,看看是否有更好的方法。

任何评论都将不胜感激。 谢谢,大卫

0 个答案:

没有答案