gpt4 book ai didi

c - 为什么我的用于计算余弦的泰勒级数对于某些输入不准确?

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:43 27 4
gpt4 key购买 nike

我正在使用泰勒级数计算 cos(x) 的值,该级数计算最多 n 项的级数,其中 n 由用户输入。

我得到了一些值的正确输出(最多可以纠正 4 位小数,这非常好)但是我也得到了一些 x 值的严重错误输出。请查看我的代码并告诉我这里究竟出了什么问题。

输入x=0.5 n=10,输出cos(x) = 0.877583,这是正确的。

输入 x=-0.8 n=7,输出 cos(x) = 0.696707,再次正确。

输入 x=5 n=10,输出 cos(x) = 0.283625,正确。

输入:x=10 n=10 输出:cos(x) = -34.438612 巨大的误差

double x, t=1,s=1;
int i,n;

printf("Enter x\n");
scanf("%lf",&x);
printf("Enter n");
scanf("%d",&n);

for(i=1;i<n;i++){
t*=(-x*x)/((2*(i-1)+2)*(2*(i-1)+1));
s+=t;
}

printf("\n %lf \n", s);

为什么我的用于计算余弦的泰勒级数对于某些输入不准确?

最佳答案

已经有一段时间了,但我很确定 x 的域对于此计算是 {0..2},因为 x 以弧度为单位。您可以在循环中添加的测试是:

if (s < -1 || s > 1) {
fprintf(stderr, "Range error!: %le\n", s);
exit(1);
}

另外,如果你有一个 unix-y 系统,这是你在 bc 中的程序,它不依赖于 float 近似:

scale=20
define t(x,n) {
auto i, s, t
s = 1
t = 1
for (i=1; i<n; i++) {
t*=(-x*x)/((2*(i-1)+2)*(2*(i-1)+1))
s+=t
if (s < -1 || s > 1) {
"range error!\n"; return s
}
}
return s
}

您可以使用 bc filename 以交互方式运行它,然后输入您的示例,例如 t(8, 10)。

至于序列是否对所有x值收敛;我的数学可能不足以回答这个问题。这就是我选择编程的原因,数学很难。但是,这是来自旧系统 bclib.b 的余弦定义:

define  c(x) {
auto a, b, c, d, e, g, y;
y = - x*x;
a = 1;
b = 1;
c = b;
d = 1;
e = 1;
for (a=2; 1 == 1; a += 2) {
b *= y;
c = c*a*(a-1) +b;
d *= a*(a-1);
g = c/d;
if (g == e) return (g);
e = g;
}
}

这与您的略有不同,但似乎适用于任何范围的输入。所以,你可能想看看有什么不同......(请注意,在 bc 中,变量 scale 保存计算器工作的精度;因此 c(8,10) 是 scale=10;c(8)

关于c - 为什么我的用于计算余弦的泰勒级数对于某些输入不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57945839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com