【问题标题】:Workaround for passing a method into a method?将方法传递给方法的解决方法?
【发布时间】:2014-07-28 17:33:28
【问题描述】:

我正在寻找一种将方法作为参数传递给另一个方法的方法。

我目前正在尝试使用以下代码在 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) 从 x0 开始运行 y 的迭代。 我有 2 个不同的函数(y2 和 y4,它们都是我讲座中的练习表中的函数,加上迭代方法中使用的派生词 y2Deriv 和 y4Deriv)。

我知道传递方法是不可能的,但我没有任何简单的解决方法。

如果不清楚或者我错过了任何必要的信息,请原谅我!

问候,

Tak3r07

【问题讨论】:

    标签: java function math methods parameters


    【解决方案1】:

    从 Java 8 开始完全有可能,使用 lambda expressions

    【讨论】:

      【解决方案2】:

      如果您想继续使用 Java-8 之前的方法,请使用成员函数 evalderiv 创建一个接口 Function,并将派生类的(可能是匿名的)实例传递给 Newton 类调用。


      这可能看起来像(我不确定所有细节是否正确,这些只是说明想法的代码片段)

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

      【讨论】:

      • 或者使用谷歌Guava的functional idioms
      • 我没有完全理解你的意思。你想让我创建一个接口“Function”,它有两种方法——一种用于函数本身,另一种用于它的派生。但是“将派生类的实例传递给牛顿类调用”是什么意思?
      • 添加了一些代码片段。我有一些适用于 regula falsi 方法的这些原则的工作代码,但没有再次找到它。
      • 太棒了,谢谢!我什至不知道我可以启动一个接口的对象。我对java的理解还处于起步阶段。
      • 不是这样的。它使用提供的方法实现创建一个匿名类并实例化该类的对象。例如,您会经常在 Event- 和 ActionListeners 中找到这种结构。它最接近函子/lambda 表达式,但实际上无法使用它们。
      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 2014-01-05
      • 2015-11-04
      • 2011-01-01
      • 2021-04-25
      • 2014-06-03
      • 2011-12-07
      • 1970-01-01
      相关资源
      最近更新 更多