写一个无限和的公式,为什么它不能像写的那样工作?
Writing a formula for an infinite sum, why doesn't this work as written?
我在 Java 里面写了一个无限和来匹配 -
sqrt(t)*sech(t)^2 dt
从 t=0
到 t=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
我在 Java 里面写了一个无限和来匹配 -
sqrt(t)*sech(t)^2 dt
从 t=0
到 t=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