与Riemann和中点Java的集成

与Riemann和中点Java的集成,java,eclipse,Java,Eclipse,我在Java中学习过如何找到黎曼和(中点)。我的问题是,我总是得到一个错误的答案,应该是这样 例如: a=-5,b=12,n=40,结果应该是:608.910781249999(但我得到:535.0809101562498) a=-5,b=12,n=200,结果应该是:609.156431250013(但我得到:555.8486222812485) 函数是:试试这个。还有,是黎曼,不是赖曼。最后,n应该是整数,而不是双精度 您错过了将第一个_mid_p更新到正确位置的部分(即“+i*width”

我在Java中学习过如何找到黎曼和(中点)。我的问题是,我总是得到一个错误的答案,应该是这样

例如:

a=-5,b=12,n=40,结果应该是:608.910781249999(但我得到:535.0809101562498)

a=-5,b=12,n=200,结果应该是:609.156431250013(但我得到:555.8486222812485)


函数是:试试这个。还有,是黎曼,不是赖曼。最后,n应该是整数,而不是双精度

您错过了将第一个_mid_p更新到正确位置的部分(即“+i*width”部分)

测试仪链接:

publicstaticdouble-intRiemann(双a、双b、双n){
双宽度=(b-a)/n;
双和=0.0;
对于(int i=0;i
使用Java中的函数式编程可以更有效地解决此问题。 可以将积分定义为1个变量的Rieman近似函数,如下所示,其中迭代次数为100000:

static final Function<Function<Double,Double>,Function<Double,Function<Double, Double>>> 
integral = f -> a -> b ->
{
    final double dx=(b-a)/100000;
    return IntStream.range(0, 100000).mapToDouble(i -> f.apply(a+i*dx)*dx).sum();
};
静态最终函数
积分=f->a->b->
{
最终双dx=(b-a)/100000;
返回IntStream.range(0,100000).mapToDouble(i->f.apply(a+i*dx)*dx).sum();
};

要传递函数,您试图计算积分的函数是什么?您是否使用调试器进行了逐步调试,并确保每一步都等于您期望的值?学习调试是学习编程的一个重要部分。你在循环中没有使用“i”,你在做n次完全相同的事情,就像:(虚构)*(n+1)所以它不是很有用我更新了我的帖子Function@yshavit添加了操作代码中错误的解释。谢谢。这也可以使用一个接口来简化,公共接口Riemann扩展了双函数{},然后将积分定义为int N=100000;黎曼s=(f,n)->(a,b)->IntStream.range(0,n).mapToDouble(i->f.apply(a+i*((b-a)/n))*((b-a)/n)).sum();
static final Function<Function<Double,Double>,Function<Double,Function<Double, Double>>> 
integral = f -> a -> b ->
{
    final double dx=(b-a)/100000;
    return IntStream.range(0, 100000).mapToDouble(i -> f.apply(a+i*dx)*dx).sum();
};