gpt4 book ai didi

计算函数sin()

转载 作者:太空狗 更新时间:2023-10-29 14:55:04 25 4
gpt4 key购买 nike

为了我的研究,我必须编写一个算法来计算 sin() 使用这个函数:

但是,在我的算法中,我必须将 X 的值保持在 0 和 Pi/2 之间。所以,我写了我的算法,但所有的结果都是错误的。

这是我的代码:

double sinX(double x){
double resultat = 0;
int i;
if(x < 0 || x > M_PI_2)
x = fmod(x,M_PI_2);

for(i = 1;i<=30;i++){
resultat += -1 * ((x*x)/(2*i*(2*i+1)))*(pow(-1,i-1))*((pow(x,2*i-1))/(factorielle(2*i-1)));
}

return resultat;
}

没找到原因。你能帮帮我吗?

这里是 X 的几个值和 fmod 的结果

1 / 1
2 / 0.429204
3 / 1.4292
4 / 0.858407
5 / 0.287611
6 / 1.28761
7 / 0.716815
8 / 0.146018
9 / 1.14602
10 / 0.575222
11 / 0.00442571
12 / 1.00443
13 / 0.433629
14 / 1.43363
15 / 0.862833
16 / 0.292037
17 / 1.29204
18 / 0.72124
19 / 0.150444
20 / 1.15044

和算法的结果

1 / -0.158529
2 / -0.0130568
3 / -0.439211
4 / -0.101605
5 / -0.00394883
6 / -0.327441
7 / -0.0598281
8 / -0.000518332
9 / -0.234888
10 / -0.0312009
11 / -1.44477e-008
12 / -0.160572
13 / -0.0134623
14 / -0.443022
15 / -0.103145
16 / -0.00413342
17 / -0.330639
18 / -0.0609237
19 / -0.000566869
20 / -0.237499

这是我对“factorielle”的定义

double factorielle(double x){
double resultat = 1;
int i;

if(x != 0){
for (i=2;i<=x;i++)
{
resultat *= i;
}
}
else{
resultat = 1;
}

return resultat;
}

和值(value)观:

1 / 1
2 / 2
3 / 6
4 / 24
5 / 120
6 / 720
7 / 5040
8 / 40320
9 / 362880
10 / 3.6288e+006
11 / 3.99168e+007
12 / 4.79002e+008
13 / 6.22702e+009
14 / 8.71783e+010
15 / 1.30767e+012
16 / 2.09228e+013
17 / 3.55687e+014
18 / 6.40237e+015
19 / 1.21645e+017
20 / 2.4329e+018

最佳答案

您误解了您显示的第二个公式的用途。这个想法是您使用该公式计算总和中的每一项来自前一项,从而使您无需使用任何powfactorial调用。

#include <stdio.h>

double sinX(double x) {
double term, total_so_far;
int i;

term = x; /* First term in the expansion. */
total_so_far = 0.0;
for (i = 1; i <= 30; i++) {
/* Add current term to sum. */
total_so_far += term;
/* Compute next term from the current one. */
term *= -(x * x) / (2*i) / (2*i + 1);
}
return total_so_far;
}


int main(void) {
/* testing */
double x;
int i;

for (i = 0; i <= 10; i++) {
x = i / 10.0;
printf("sin(%f) is %f\n", x, sinX(x));
}
return 0;
}

以及在我的机器上运行这段代码的结果:

sin(0.000000) is 0.000000
sin(0.100000) is 0.099833
sin(0.200000) is 0.198669
sin(0.300000) is 0.295520
sin(0.400000) is 0.389418
sin(0.500000) is 0.479426
sin(0.600000) is 0.564642
sin(0.700000) is 0.644218
sin(0.800000) is 0.717356
sin(0.900000) is 0.783327
sin(1.000000) is 0.841471

对于 0pi/2 的范围,这应该会给出合理的结果。在该范围之外,您需要更巧妙地使用缩减:简单地缩减模 pi/2 不会给出正确的结果。 (提示:减少模 2 * pi 是安全的,因为 sin 函数是周期性的,周期为 2 * pi。现在使用对称性sin 函数减少到 0pi/2 的范围。)


编辑 当前代码给出不正确结果的原因的解释:除了有缺陷的归约步骤之外,在您的求和中,您从术语i = 1 开始。但第一项应该是 i = 0(即 x 项,而 i=1 项是 -x ^3/3! 项)。一个快速而肮脏的修复是删除缩减步骤,并将 resultat 变量初始化为 x 而不是 0。对于较小的 x,这应该会给您带来不错的结果,然后您可以弄清楚如何替换减少步骤。不过,如果您真的打算使用显式阶乘和幂调用来计算答案,我会感到很惊讶 - 我几乎可以肯定,您应该如上所述计算前一项的每一项。

关于计算函数sin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19909501/

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