我正在努力在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类的任何内容都不会被公开。所以我很高兴,但我绝不认为自己是一个专家,所以我想我会看到人们的想法,看看是否有更好的方法。
任何评论都将不胜感激。 谢谢,大卫