使用 C 语言求解指数函数 (ex) 的泰勒级数

2025年1月7日 | 阅读 4 分钟

泰勒级数是 Brook Taylor 在 18 世纪引入的对不同函数的一种数学表示。任何函数都可以表示为无限项之和。通用形式为:

f(x) = f(a) + f'(a)(x - a) + f''(a)(x - a)2/2! + f'''(a)(x - a)3/3! + ...n 项

当指数函数 (ex) 用这种形式表示时:

ex = 1 + x/1 + x2/2! + x3/3! +….+ n 项

本教程将介绍不同的方法,利用这些方法我们可以编写一个程序,在给定 x 和 n 的值的情况下得到函数的值。

输入: x 和 n

例如,给定 x = 4 和 n = 2,我们需要计算 e4 展开到 2 项后的值并返回。

e4 = 1 + 4/1 + 42/2!

观察每一项中有两个函数:

  1. m 的 n 次幂
  2. n 的阶乘

方法 1:为 m 的 n 次幂和阶乘实现两个函数

方法

对于 x = 3 和 n = 2

power(3, 2)/fact(2) + taylor(3, 1)

9/2 + power(3, 1)/fact(1) + taylor(0)

4.5 + 3 + 1

8.5

泛化

Taylor(x, n) = power(x, n)/factorial(n) + Taylor(x, n -1)

输出

Enter the value of x: 3
Enter the value of n: 2
e to the power 3.0 till 2 terms: 8.500000

递归函数过多;我们来简化一下。

方法 2:仅使用一个函数

我们只需要一个函数来同时计算幂和阶乘的功能,该函数计算泰勒级数的值。

让我们举个例子

x = 3, n = 2

对于 n = 0 -> pow(3, 0) = 1, fact(0) = 1, Taylor(3, 0) = 1

对于 n = 1 -> pow(3, 1) = 3, fact(1) = 1, Taylor(3, 1) = 3

对于 n = 2 -> pow(3, 2) = 9, fact(2) = 2, Taylor(3, 2) = 8.5

观察到,在每次递归调用中,pow(m, n) = m*pow(n-1) 和 fact(n) = n*fact(n-1) 应该作为变量而不是单独的函数。

这里的关键在于,需要在泰勒函数的递归调用之间持久化这些值,为此我们需要使用静态变量

输出

Enter the value of x: 3
Enter the value of n: 2
e to the power 3.0 till 2 terms: 8.500000

我们需要在每次递归调用中进行乘法运算以计算幂和阶乘。需要减少执行的乘法次数。

方法 3 (秦九韶算法)

秦九韶算法可以用来求解多项式表达式,而无需进行过多的乘法运算,从而使程序运行更快。我们不断提取公因式,并找出可以在循环或递归调用中使用的模式。

方法

ex = 1 + x/1 + x2/2! + x3/3! + …. + n 项

假设 n = 4

ex = 1 + x/1 + x2/2! + x3/3! + x4/4!

= 1 + x/1(1 + x/2 + x2/2*3 + x3/2*3*4)

= 1 + x/1(1 + x/2(1 + x/3 + x2/3*4)

= 1 + x/1(1 + x/2(1 + x/3(1 + x/4)))

泛化

对于 n = 4

假设 sum = 1

计算 1 + x/4

更新 sum = 1 + (x/4) * sum

这意味着

最初,sum = 1

sum = 1 + (x/n) * sum

输出

Enter the value of x: 3
Enter the value of n: 2
e to the power 3.0 till 2 terms: 8.500000

迭代方法

输出

Enter the value of x: 3
Enter the value of n: 2
e to the power 3.0 till 2 terms: 8.500000