首页 > 解决方案 > 我应该改变什么,以便我的 arctan(x) 近似可以正确显示 x=1 和 x=-1?

问题描述

我的 C 任务之一是用 C 语言编写 的近似值arctan(x)。我应该基于的等式是

arctan(x)=\sum {k=0}^{\infty }(-1)^{k} \tfrac{x^{2k+1}}{2k+1}

在此处输入图像描述

此外 x 仅定义为-1<=x<=1

这是我的代码。

#include <stdio.h>
#include <math.h>


double main(void) {

    double x=1;
    double k;
    double sum;
    double sum_old;
    int count;

    double pw(double y, double n) {
        double i;
        double number = 1;

        for (i = 0; i < n; i++) {
            number *= y;
        }
        return(number);
    }

    double fc (double y) {
        double i;
        double number = 1;

        for (i = 1; i <= y; i++){
            number *= i;
        }
        return(number);
    }

    if(x >= (-1) && x <= 1) {
        for(k=0; sum!=sum_old; k++) {
            sum_old = sum;
            sum += pw((-1), k) * pw(x, (2*k) + 1)/((2*k) + 1);
            count++;

            printf("%d || %.17lf\n", count, sum);
        } 



    printf("My result is: %.17lf\n",sum);
    printf("atan(%f) is: %.17f\n", x, atan(x));
    printf("My result minus atan(x) = %.17lf\n", sum - atan(x));
    } else {
        printf("x is not defined. Please choose an x in the intervall [-1, 1]\n");
        }



return 0;
}

它似乎适用于每个值,除了 value1-1. 如果x=1,则输出以:

...
7207 || 0.78543285189457468
7208 || 0.78536

而输出应该看起来更像这样。在这种情况下 x=0.5。

25 || 0.46364760900080587
26 || 0.46364760900080587
My result is: 0.46364760900080587
atan(0.500000) is: 0.46364760900080609
My result minus atan(x) atan(x) = -0.00000000000000022

如何改进我的代码,以便它可以x=1x=-1.

提前致谢。

PS:我使用我自己创建的pw()函数而不是pow(),因为我想绕过不使用的限制,pow()因为我们在讲座中还没有这个限制。

PPS:我很感激任何关于如何改进我的代码的建议。

标签: cloopsfor-loopmathtypes

解决方案


在每次迭代中,添加 (-1) kx 2 k +1 / (2 k +1),当总和没有变化时停止。

如果这是用理想算术(精确的,无限精确的算术)计算的,它永远不会因为非零而停止x,因为你总是在改变总和。当使用固定精度算术计算时,它会在项太小时因为精度有限而不会改变总和时停止。

什么时候 | x | 小于一,因为x 2 k +1变小了。什么时候 | x | 是一,这个项变成了 1 / (2 k +1),它变得非常缓慢。直到k在 2 53左右,总和才会停止变化。

您可能会考虑将停止条件sum更改为没有发生sum_old很大变化而不是根本没有变化的时候。


推荐阅读