首页 > 编程知识 正文

e∧x的泰勒公式,ln2泰勒展开

时间:2023-05-03 06:24:41 阅读:161993 作者:3560

我们知道对数函数ln(x )可以展开成欢呼声的棒球级数。

但是,下一个欢呼声的棒球级数展开式正在更快地结束。

通过简单的计算,可以知道上式的y=(x-1 )/(x1 )。

实现该算法的C#程序,基于上面第二个欢呼声的棒球级数展开式,可以对C#的decimal数据类型实现如下Log扩展方法。

1使用系统; 2 namespaceskyiv.extensions4{5staticclassdecimalextensions6{7staticreadonlydecimalln 10=2.30258509294045684017914547 M8 910公共数据记录10 (thisdecimallog 10 ) 11 ) 12返回记录x )/ln10; 13 ) 1415公共数据说明(thisdecimallog ) 16 ) 17if ) x=0) thrownewargumentexception (' must be positive ' ); 18 int k=0,l=0; 19 for (; x 1; k ) x /=10; 20 for (; x=0.1m; k----x*=10; //(0.1,1 ) 21for ); x 0.9047m; l-- ) x *=1.2217m; //[ 0.9047,1.10527199 ] 22 returnk * ln10l * lnr logarithm ((x-1 )/(x1 ) ) ); 23 ) 2425静态解码逻辑阵列(decimaly ) 26 )/yin(-0.05-,0.05 ),returnln ) ) (1y )/(1-y ) ) 27解码z!=0; z=(t*=y2 )/) I=2) ) v =z; 29返回v * y * 2; 30 }31 }32 }在本程序中:

第七行是预先计算的ln(10 )值,用于第12行和第22行。 第8行是预先计算的ln(1.2217 )值,用于第22行。 第15行到第23行的Log扩展方法用于计算自然对数。 在第19~20行中,将参数x的值转换为[ 0.1,1 ]的区间。 这两个循环只执行其中一个,循环次数不超过28次。 通过第21行,并且将参数x的值转换成[ 0.9047,1.10527199 ]的区间。 此周期的执行次数不超过11次。 第22行调用Logarithm方法计算自然对数。 传递的参数为(x - 1 )/(x1 ),其范围约为(-0.05,0.05 )的区间。 第22行中的表达式基于两个对数函数ln(xy )=ln ) x ) ln ) y )和ln ) xn )=nln ) x )的运算规则。 当然,后者是前者的特例。 第25行到第30行的Logarithm方法使用欢呼的棒球级数计算自然对数,其参数y越接近零收敛越快。 请注意,返回值为ln。(

+y)/(1-y)),而不是 ln(y)。这个算法还是很快的,第 28 行的 for 循环执行次数不会超过 10 次。 程序中相关常数的由来

上面程序中的 1.2217 和 0.9047 等常数是如何得到的呢?请看下面的计算:

work$ bc -lbc 1.06Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'. scale=30define x(y) { return (1+y)/(1-y); }x(-0.05).904761904761904761904761904761x(0.05)1.1052631578947368421052631578941.10526/0.90471.221686746987951807228915662650l(1.2217).200243331427877111201630116698l(1.2216).200161474922285626409839638619quitwork$

上面使用 Linux 中的 bc 进行计算,l 代表 ln 函数,请参阅参数资料[3]。分析如下:

我们的目标是要将第 25 行的 Logarithm 方法的参数 y 控制在 ( -0.05, 0.05 ) 区间范围内。由前面引言中知道,x = (1+y) / (1-y)。所以计算出 x 大约在 ( 0.9047, 1.10526 ) 区间范围内。为了第 21 行的将 x 值变换到上述区间,计算出变换因子 1.10526 / 0.9047 ≈ 1.2217 。这就得到第 8 行的 ln(1.2217) 的值。注意该值最后几位是 ...6698,舍入到 ...6700,误差相当小。(decimal 要求舍入到 28 个有效数字)我原来在第 2 步采用区间 ( -0.90476, 1.105263 ),计算出来的变换因子是 1.105263 / 0.90476 ≈ 1.2216 。相应的 ln(1.2216) 的最后几位是 ...8619,舍入到 ...8600,误差就稍微大了一点。 验证常数的值

让我们来验证一下前面计算的常数的值是否正确:

work$ bc -lbc 1.06Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'. scale=30r=1.2217a=0.9047b=a*rb1.10527199define y(x) { return (x-1)/(x+1); }y(a)-.050034126109098545702735338898y(b).050003985470779953710399196447quitwork$

说明如下:

我们得到 x 在 [ 0.9047, 1.10527199 ) 区间范围内。由前面的引言可知,y = (x - 1) / (x + 1),大约在 ( -0.05, 0.05 ) 区间范围内。这说明我们以前的计算是正确的。 测试程序

下面是调用 decimal 数据类型的 Log 和 Log10 扩展方法的测试程序:

1 using System; 2 using Skyiv.Extensions; 3 4 class Tester 5 { 6 static void Main() 7 { 8 foreach (var x in new decimal[] { 4 / decimal.MaxValue, 9 0.0000001m, 0.0001m, 0.1m, 1, 1.2217m, 2, 10, 10000,10 100000000, decimal.MaxValue })11 {12 Console.WriteLine("x : " + x);13 Console.WriteLine("ln: " + x.Log());14 Console.WriteLine("lg: " + x.Log10());15 Console.WriteLine();16 }17 }18 }

运行结果如下所示:

work$ dmcs Tester.cs DecimalExtensions.cswork$ mono Tester.exex : 0.0000000000000000000000000001ln: -64.472382603833279152503760732lg: -28.000000000000000000000000000x : 0.0000001ln: -16.118095650958319788125940183lg: -7.0000000000000000000000000000x : 0.0001ln: -9.210340371976182736071965819lg: -4.0000000000000000000000000001x : 0.1ln: -2.3025850929940456840179914547lg: -1x : 1ln: 0lg: 0x : 1.2217ln: 0.2002433314278771112016301167lg: 0.0869645738770510340282719812x : 2ln: 0.6931471805599453094172321215lg: 0.3010299956639811952137388947x : 10ln: 2.3025850929940456840179914547lg: 1x : 10000ln: 9.210340371976182736071965819lg: 4.0000000000000000000000000001x : 100000000ln: 18.420680743952365472143931638lg: 8.000000000000000000000000000x : 79228162514264337593543950335ln: 66.542129333754749704054283660lg: 28.898879583742194740518933893

从上面运行结果可以看出,精度基本上达到了 28 位有效数字,比我前几天的“计算自然对数的快速算法”一文介绍的算法要好。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。