尝试用Java编写一个程序,使用以下等式计算sin (x)的幂级数近似:
x - x^3/3! + x^5/5!... x^n/n!
我正在使用while循环执行此操作,但似乎无法获得sin近似值的100%正确。你知道我哪里错了吗?
{
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发布于 2014-09-18 13:53:33
你没有正确地实现公式-我看不出幂n在哪里…
我希望你有像x = x + (n^-1) * (x^(2*n)/fac( (2*n) ) );这样的东西,有n个步骤
注意^运算符不适用于双精度,但这不是一个复制/粘贴解决方案(如@paxDiablo(https://stackoverflow.com/users/14860/paxdiablo)所示),它只是一个关于如何解决您的问题的解决方案……
发布于 2014-09-18 14:01:46
表达式(count * (count - 1))不是count!,绝对不是。
当count变成4的时候,你就开始得到错误了。因为4!是24,而4 x 3只是12。当然,更糟糕的是:10 x 9是90,但10!是350万。
您遇到的另一个问题是,您的if (count >= n)条件可能不符合您的预期。除了对于某些语句来说,它几乎肯定是错误的条件(如果count仍然小于n,但break在给定条件下是有意义的),您的缩进让我相信您认为将为该if语句执行整个代码块:
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 + ")");
}
}以及使用您的测试数据的示例运行,展示了它的实际效果:
Enter positive odd integer: 99
Using 99
Enter x: 0.7
Using 0.7
0.644217687237691 <-- sum
0.644217687237691 <-- sin(0.7)https://stackoverflow.com/questions/25905063
复制相似问题