尝试用Java编写程序,使用以下公式计算sin(x)的幂级数近似:
x - x^3/3! + x^5/5!... x^n/n!
我正在使用while循环执行此操作,我似乎无法获得100%正确的sin近似值。知道我哪里错了吗?
{
double x = 0.0, sum = 1.0, y;
int n = 1, count = 1;
Scanner kb = new Scanner(System.in);
System.out.println("Enter positive odd integer");
n = kb.nextInt();
System.out.println(n);
System.out.println("Enter x");
x = kb.nextDouble();
y = x;
System.out.println(x);
while (true)
{
if (n == 1)
{sum = x;
}
count = count + 2;
sum = x + (x * -(x * x) / (count * (count - 1)));
x = sum;
if (count >= n)
count = count + 2;
sum = x + (x * -(x * x) / (count * (count - 1)));
x = sum;
break;
}
System.out.println("sum = " +sum);
System.out.printf("sin("+y+") = " +Math.sin(y));
}
目前这给我以下输出:
Enter positive odd integer
99
Enter x
0.7
sum = 0.598559827320216
sin(0.7) = 0.644217687237691
答案 0 :(得分:2)
你没有正确实现公式 - 我无法看到权力在哪里......
我希望你有x = x + (n^-1) * (x^(2*n)/fac( (2*n) ) );
有n个步骤的东西
注意 ^运算符不适用于双精度数,但这不是复制/粘贴解决方案(从@paxDiablo(https://stackoverflow.com/users/14860/paxdiablo)可以看出仅仅是解决方法问题...
答案 1 :(得分:1)
表达式(count * (count - 1))
不是 count!
,而不是远景。
当count
变为四时,您就会开始出错。因为4!
为24
,但4 x 3
仅为12
。它变得更糟,当然:10 x 9
是90
,但是10!
是一个非常高的三分之一
您遇到的另一个问题是您的if (count >= n)
条件可能没有达到预期效果。除了事实上几乎肯定是某些陈述的错误条件(如果count
仍然少而不是n
,你只想做另一个术语,但{ {1}}对于给定的条件是有意义的),你的缩进让我相信你认为整个块将被执行if if语句:
break
然而,缩进不能控制,支撑。没有大括号,只有第一个缩进语句受if (count >= n)
count = count + 2;
sum = x + (x * -(x * x) / (count * (count - 1)));
x = sum;
break;
的约束,所有其他语句都在每次迭代中发生。
但是,无论如何,你的代码逻辑似乎非常......错误,折磨。关于大多数无限级数计算的好处是你真的只需要担心总和和当前的术语。当你可以像这样循环时,连续交换所有这些变量似乎很令人费解:
if
显示此操作的完整程序如下:
double mult = 1.0;
while (count <= n) {
term = Math.pow(x,count) / facto (count);
sum += mult * term;
count += 2;
mult = -mult;
}
使用您的测试数据运行示例,并将其显示在行动中:
import java.util.Scanner;
public class Test {
public static double facto (int inum) {
double num = inum;
while (--inum > 1)
num *= inum;
return num;
}
public static void main(String[] args) {
double term = 0.0, sum = 0.0, x;
int n, count = 1;
Scanner kb = new Scanner(System.in);
System.out.print("Enter positive odd integer: ");
n = kb.nextInt();
if ((n < 1) || (n % 2) == 0) {
System.out.println("Apparently, someone can't read too well :-)");
n = (n < 1) ? 1 : n + 1;
}
System.out.println("Using " + n);
System.out.print("Enter x: ");
x = kb.nextDouble();
System.out.println("Using " + x);
double mult = 1.0;
while (count <= n) {
term = Math.pow(x,count) / facto (count);
sum += mult * term;
count += 2;
mult = -mult;
}
System.out.println("" + sum + " <-- sum");
System.out.printf("" + Math.sin(x) + " <-- sin(" + x + ")");
}
}