前段时间看了一个手算开平方的视频,感觉还是不够通用。
说起通用,首先把我们要计算的根式通用化。我们常见的平方根、立方根,或者叫二次方根、三次方根,其实都可以写成幂函数的形式。
说一个日常的小习惯。大家如果平时用Excel的话,遇到计算平方根的时候会怎么做呢?Excel内置的函数中SQRT()就是计算平方根的。如果计算根号2,就是SQRT(2)。但是我平时喜欢写成幂函数形式,也就是a ^ x的形式。根号2就是2 ^ 0.5 。
【资料图】
※这里说指数函数也行。函数变量是底数叫幂函数,变量是指数叫指数函数
个人觉得,根式的幂函数形式写起来更顺畅,做一些规则也更方便。
回到主题。我们现在需要手工计算π次根号5 。
我之前写过一篇用泰勒展开式手算三角函数的,这回也还是用老办法。以e(自然对数的底)为底数的指数函数有一个比较简洁的泰勒展开式。
想用这个公式就必须要把幂函数转换成以e为底的指数函数,那就套个换底公式。
那么我们要计算的就是:
那么问题来了,对数怎么算呢?ln(5)怎么计算。
其实我们不妨再套一次泰勒展开。
不过这个式子有一个前提,x的范围必须是-1~1之间(可以等于1,不可等于-1)。
所以这个方法至多计算到ln(2)。算ln(5)就超范围了。但是我们可以用对数的特性解决这个事情。5=2×2×1.25,那么:
ln(1.25)不就能算了吗。
好了,现在只要把n取的足够大,就能得到我们想要的精度的结果。老办法我们用Excel内置的VBA来实现这个新函数,看看n与精度的关系。代码如下:
Function PowTay(a As Double, x As Double, n As Integer) As Double
Dim i As Integer
Dim at As Double
Dim an As Integer
Dim k As Double
Do While a > 2
an = an + 1
a = a / 2
Loop
at = an * Log(2)
a = a - 1
For i = 1 To n
at = at + ((-1) ^ (i + 1)) * (a ^ i) / i
Next i
x = at * x
For i = 0 To n
k = Application.WorksheetFunction.Fact(i)
PowTay = PowTay + (x ^ i) / k
Next i
End Function
函数的名字叫PowTay,有3个变量。a是底数,x是指数,n是泰勒展开式中n的取值。
这里为了图方便,ln(2)的值就当常数直接用了。
与工作表里不同,VBA里的对数函数Log()是以e为底的,相当于ln()。如果要用其他底数的话可以套个换底公式。
Application.WorksheetFunction.Fact(i)是调用工作表里的阶乘函数FACT()。
我们可以计算一下n取1到10时,计算值与实际值得偏差,代码如下:
Sub text2()
Dim a As Double
Dim x As Double
Dim n As Integer
Dim s As Double
a = 5
x = 1 / Application.WorksheetFunction.Pi()
s = a ^ x
For n = 1 To 10
Cells(n + 1, 1).Value = n
a = 5
x = 1 / Application.WorksheetFunction.Pi()
Cells(n + 1, 2).Value = s - PowTay(a, x, n)
Next n
End Sub
因为函数运算的时候a和x的值会改变,所以每次运算前要重新赋值(也可以把函数优化一下)。运行结果如下:
通常我们有个n=4的精度其实也差不多了。所以就取n=4,写成可以手算的形式。
π和ln(2)就取到小数点后5位。结果取小数点后4位。
π=3.14159,ln(2)=0.69315
结果是1.60928
1.60928/3.14159是0.51225
这样就变成有理数加减乘除的形式了。
计算结果是1.6687 。
这个方法具有很好的普适性,即便带着无理数也能计算。你也可以试试看计算5的π次方会是什么结果。
当然,这个方法的弊端就是计算结果数值越大,n的取值就必须大一些才能满足精度。我试了一下计算5的3次方,n要取到13才能让结果大于124.9 。