我正在寻找一种方法将方法作为参数传递给另一种方法。
我目前正尝试使用以下代码在Java中模拟牛顿方法(http://en.wikipedia.org/wiki/Newton%27s_method):
public class Newton {
// Iterationmethod
public void newtonCalc(double x0) {
double x;
// counter
int i = 0;
//Newton-Iteration for x0
x = x0 - (y2(x0) / y2Deriv(x0));
while (Math.sqrt(y2(x)*y2(x)) >= Math.pow(10, -10)){
//Newton-Iteration x(n+1)
x = x - (y2(x))/ y2Deriv(x);
i++;
System.out.printf("%d. %.11f\n",i,y2(x));
}
System.out.printf("%d steps were necessary for a resolution of 10^-10", i);
}
// Function for (2)
public static double y2(double x) {
return Math.sin(x) / (1 - Math.tan(x));
}
// Derivative for (2)
public static double y2Deriv(double x) {
return (Math.cos(x) + Math.sin(x) * Math.tan(x) * Math.tan(x))
/ ((Math.tan(x) - 1) * (Math.tan(x) - 1));
}
// Function for (4)
public static double y4(double x) {
return Math.exp(-1/Math.sqrt(x));
}
// Derivative for (4)
public static double y4Deriv(double x) {
return Math.exp(-1/Math.sqrt(x))/(2*Math.pow(x, 3d/2));
}
public static void main(String[] args) {
Newton newton = new Newton();
newton.newtonCalc(1);
}
}
newtonCalc(x0)得到一个x0,应该开始迭代。 但是函数(y2)现在被硬编码到这个方法中。我希望它具有灵活性。 例如newtonCalc(double x0,Method y)从y0开始运行y的迭代。 我有2个不同的功能(y2和y4,这两个功能都来自我演讲的练习单及其衍生词y2Deriv和y4Deriv,它们在Iterationmethod中使用)。
我知道传递方法是不可能的,但我没有得到任何简单的解决方法。
如果不清楚或我错过了任何必要的信息,请原谅我!
此致
Tak3r07
答案 0 :(得分:1)
从Java 8开始,使用lambda expressions
完全可能答案 1 :(得分:1)
如果您希望继续使用Java-8之前的方法,请使用成员函数Function
和eval
创建一个接口deriv
,并将派生类的实例(可能是匿名的)传递给牛顿类调用。
这可能看起来像(我不确定所有细节都是正确的,这些只是用来说明这个想法的代码片段)
interface Function {
public double eval(double x);
public double deriv(double);
}
class Example1 implements Function {
@override
public double eval(double x) { return x*(x+3)+1; }
@override
public double deriv(double) { return 2*x+3; }
}
....
Solver solver1 = new Newton(new Example1(),x0);
....
Solver solver2 = new Newton(new Function(){
@override
public double eval(double x) { return cos(x); }
@override
public double deriv(double) { return -sin(x); }
}, x0);