写一个无限和的公式,为什么它不能像写的那样工作?

Writing a formula for an infinite sum, why doesn't this work as written?

我在 Java 里面写了一个无限和来匹配 -

sqrt(t)*sech(t)^2 dtt=0t=infinity(从 t = 0 开始然后在 t = infinity 结束的无限总和。我正在引用 Wolfram Alpha(Mathematica ) 来比较我的结果)。

用更多的数学术语来说,这就是(本质上)程序正在做的事情。我注意到这是平方(双曲)正割。虽然,最大值真的是无穷大-

integrate sqrt(t)*sech(t)^2 dt from t=0 to t=1000

为了匹配这个无限和,我在下面写了一个小程序。

public class TestSum {
   public static void main(String[] args) {
           newForm(0.5);
   }

   public static double newForm(double s) {
    int n = 0;
    double currentSum = 0;

    while (n < 1000) {
        double sech = 1 / Math.cosh(n);
        double squared = Math.pow(sech, 2);
        currentSum = ((Math.pow(n, s))*squared) + currentSum;
        if(n == 999)
            System.out.println("The current sum is " + currentSum);
        n++;
    }
    return currentSum;
   }
}

当我将其插入 Mathematica/Wolfram 时,我得到 -

integrate sqrt(t)*sech(t)^2 dt from t=0 to t=1000
integral_0^1000 sqrt(t) sech^2(t) dt = 0.758128

运行程序的结果是-

run:
The current sum is 0.5401365941579325
BUILD SUCCESSFUL (total time: 0 seconds)

我很确定 Mathematica 没有错。我的程序有什么问题?

您的解决方案不够准确。

积分可以用黎曼和来近似

在维基百科上查看 Riemann Sum

delta x(或者在你的情况下是 delta t)越小,结果越好。

在你的解决方案中 delta t = 1,所以近似值不是很好。

更好地近似结果的可能解决方案是使用:

public class TestSum {
   public static void main(String[] args) {
          double result= integrate(0, 1000);
          System.out.print("result = " + result );
   }

   public static double integrate(double start, double end) {
    double currentIntegralValue = 0;
    double dt=0.01d;
    double t = start;

    while (Math.abs(end - t) >= dt && t-end < 0) {
        currentIntegralValue += fn(t)*dt;
        t += dt;
    }
    return currentIntegralValue;
   }

   private static double fn(double t) {
        double sech = 1 / Math.cosh(t);
        double squared = Math.pow(sech, 2);
        return  ((Math.pow(t, 0.5))*squared); 
   }
}

结果 = 0.7579201343666041

您可以使用更小的dt进一步改善结果。

dt=0.00001d

结果 = 0.7581278135568323