(六)算法 -- 4. 级数展开

4. 级数展开

  • 级数展开(series expansion)
    函数的值通过对级数项的求和来估计。如果每加入一个新的项都会使总和更接近于一个所期望的值,则级数是收敛的,可以用此级数估计结果。

4.1 Zeno悖论

  • Zeno悖论(Zeno’s paradox)
    横穿房间这个过程中的每一步都是走到剩余距离的一半。

已经走过的每段距离的总和,可以表示为下式:
1 2 + 1 4 + 1 8 + 1 16 + 1 32 + 1 64 + 1 128 + . . . \frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\frac{1}{16}+\frac{1}{32}+\frac{1}{64}+\frac{1}{128}+... 21+41+81+161+321+641+1281+...

如果从1开始给这些项编号,则和式中的第 i i i项可写为:

1 2 i \frac{1}{2^i} 2i1

i i i项涉及 i i i次幂的数学级数称为幂级数(power series)。


Zeno级数有无限项,但有有限和(为1)。

计算Zeno级数和,代码实现如下:

#include <stdio.h>

/*  Calcualte the sum of Zeno's series. */

/* Main Program */
main() {
    double sum, term;
    sum = 0.0;
    term = 0.5;

    while (sum != sum + term) {
        sum += term;
        term /= 2;
    }
    printf("The sum of Zeno's series is: %g\n", sum);
}


4.2 泰勒级数近似的实现

需要写一个函数,通过幂级数展开计算平方根的近似值:

x ≅ 1 + 1 2 ( x − 1 ) − 1 4 ( x − 1 ) 2 2 ! + 3 8 ( x − 1 ) 3 3 ! − 15 16 ( x − 1 ) 4 4 ! + . . . \sqrt{x} \cong 1+\frac{1}{2}(x-1)-\frac{1}{4}\frac{(x-1)^2}{2!}+\frac{3}{8}\frac{(x-1)^3}{3!}-\frac{15}{16}\frac{(x-1)^4}{4!}+... x 1+21(x1)412!(x1)2+833!(x1)316154!(x1)4+...

最有效的策略是找出用前一项计算新的项的方法。


每一项都有三个独立的部分:
c o r f f x p o w e r f a c t o r i a l {corff} \frac{xpower}{factorial} corfffactorialxpower

对于xpower,将当前的xpower乘以x-1就得到了下一项的xpower。

对于factorial,第i项的值总是i!。任何数i的阶乘是i乘以比它小的那个数的阶乘。
为了准备第(i+1)个循环周期,需要把当前的factorial乘以i+1。

到第(i+1)个循环周期的coeff值,需要把第i个周期的值乘以 1 2 \frac{1}{2} 21 - i。


代码实现如下:

#include <stdio.h>

/* Estimate square root using Taylor expansion when 0<x<2. */


/* Function Prototype */
double TSqrt(double x);


/* Main Program */
main() {
    double x;
    printf("Input a number x (0<x<2): ");
    scanf("%lf", &x);
    if (x <= 0 | x >= 2) {
        printf("Number x should meet the condition: 0<x<2.\n");
        exit(0);
    }
    printf("Estimated square root is: %g\n", TSqrt(x));
}


/* Function */
double TSqrt(double x)
{
    double corff, xpower, factorial, sum, term;
    int i;
    sum = 0;
    corff = xpower = factorial = term = 1;

    for (i = 0; sum != sum + term; i++) {
        sum += term;
        corff *= (0.5 - i);
        xpower *= (x - 1);
        factorial *= (i + 1);
        term = corff * xpower / factorial;
    }
    return sum;
}

TSqrt函数作为泰勒级数展开,平方根函数的公式仅当参数值位于一个有限范围内时才有效,在该范围内计算趋于收敛。该范围被称为收敛半径(radius of convergence)。

泰勒级数公式希望x处于范围0<x<2。





参考
《C语言的科学和艺术》 —— 第6章 算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值