Java 中 sin(x) 的泰勒级数
Taylor series for sin(x) in Java
我正在尝试构建一个程序来计算 sin(x) 的泰勒级数。 x 大于 0 且小于 pi/2(我尝试用 latex 编写但没有工作(??))。 sin(x) 的近似值在点 x0 = 0 附近。e 是最大误差(或不准确......我不知道它是怎么称呼的)。错误(或不准确)是用我调用 r 的方法中的公式计算的。所以 r 必须总是小于 e。最后,n 是迭代次数。下面是我的程序,它没有错误,但我得到的结果不准确,我不知道我做错了什么(也许我们应该考虑使用有错误的公式的可能性)。
import java.lang.Math;
import java.util.Scanner;
public class hw74 {
public static long factorial(int number) {
long result = 1;
for (int factor = 2; factor <= number; factor++) {
result *= factor;
}
return result;
}
static double p(double x, double x0, int n) {
double PT = Math.pow(-1, n) * (Math.pow(x-x0, 2*n+1)/factorial(2*n+1));
return PT;
}
static double r(double x, int n) {
double rn = Math.pow(x, n+1)/factorial(n+1);
return Math.abs(rn);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double x0 = 0;
System.out.println("Give x. ");
double x = sc.nextDouble();
System.out.println("Give E. ");
double e = sc.nextDouble();
System.out.println("Give N. ");
int n = sc.nextInt();
int i = 0;
//System.out.println(e<r(x, i) && i<n);
//System.out.println(r(x, i));
while((r(x, i)<e) && i<n) {
i++;
System.out.println("N is : "+i);
System.out.println("P is : "+p(x,x0,n));
System.out.println("E is : "+r(x,n));
}
}
}
例如:对于 n=5、e=1 和 x=pi/5 (0.62831853071),结果应为:sin(pi/5) = 0.5877852522...对于 n=1 r=0.1974, n=2 r=0.0413, n=3 r=0.0065, n=4 r=8.16*10^(-4), n=5 r=8.54*10^(-5)
Double 是浮点类型,这样 not accurate. Use BigDecimal instead. See this answer 了解更多信息。
我们用泰勒多项式逼近泰勒级数(和)。你程序中的方法 p
只计算这个多项式中的一个项,所以你只需要对从 0 到 N 的序列求和,例如:
static double sum(double x, double x0, int n) {
double sum = 0;
for (int i = 0; i <= n; ++i) {
sum += p(x, x0, i);
}
return sum;
}
换句话说,就是用符号∑表示的部分。
edit:看看你在 main
中的逻辑,可能你已经在尝试做这样的事情了,但我不确定。我想你可能也需要重新审视一下。
我正在尝试构建一个程序来计算 sin(x) 的泰勒级数。 x 大于 0 且小于 pi/2(我尝试用 latex 编写但没有工作(??))。 sin(x) 的近似值在点 x0 = 0 附近。e 是最大误差(或不准确......我不知道它是怎么称呼的)。错误(或不准确)是用我调用 r 的方法中的公式计算的。所以 r 必须总是小于 e。最后,n 是迭代次数。下面是我的程序,它没有错误,但我得到的结果不准确,我不知道我做错了什么(也许我们应该考虑使用有错误的公式的可能性)。
import java.lang.Math;
import java.util.Scanner;
public class hw74 {
public static long factorial(int number) {
long result = 1;
for (int factor = 2; factor <= number; factor++) {
result *= factor;
}
return result;
}
static double p(double x, double x0, int n) {
double PT = Math.pow(-1, n) * (Math.pow(x-x0, 2*n+1)/factorial(2*n+1));
return PT;
}
static double r(double x, int n) {
double rn = Math.pow(x, n+1)/factorial(n+1);
return Math.abs(rn);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double x0 = 0;
System.out.println("Give x. ");
double x = sc.nextDouble();
System.out.println("Give E. ");
double e = sc.nextDouble();
System.out.println("Give N. ");
int n = sc.nextInt();
int i = 0;
//System.out.println(e<r(x, i) && i<n);
//System.out.println(r(x, i));
while((r(x, i)<e) && i<n) {
i++;
System.out.println("N is : "+i);
System.out.println("P is : "+p(x,x0,n));
System.out.println("E is : "+r(x,n));
}
}
}
例如:对于 n=5、e=1 和 x=pi/5 (0.62831853071),结果应为:sin(pi/5) = 0.5877852522...对于 n=1 r=0.1974, n=2 r=0.0413, n=3 r=0.0065, n=4 r=8.16*10^(-4), n=5 r=8.54*10^(-5)
Double 是浮点类型,这样 not accurate. Use BigDecimal instead. See this answer 了解更多信息。
我们用泰勒多项式逼近泰勒级数(和)。你程序中的方法 p
只计算这个多项式中的一个项,所以你只需要对从 0 到 N 的序列求和,例如:
static double sum(double x, double x0, int n) {
double sum = 0;
for (int i = 0; i <= n; ++i) {
sum += p(x, x0, i);
}
return sum;
}
换句话说,就是用符号∑表示的部分。
edit:看看你在 main
中的逻辑,可能你已经在尝试做这样的事情了,但我不确定。我想你可能也需要重新审视一下。