Ch03:数值计算方法之常用函数值计算方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3 数的开平方与开立方
• 求一个正数a的算术平方根或立方根总是一个很重
要的数学问题,在工程计算中也有广泛的应用,所 以只得编写专门的c语言函数。
•首先可以牛顿法求1~100以内的书的平方根和
1~1000以内的数的立方根,在这种情况下牛顿求解 的效果非常好。
•对于超过上述范围的数来说,可以通过移动小数点
x3 x5 x 2 n 1 sin( x) x (1) n 3! 5! (2n 1)!
不难得到
sin( x) x2 x4 x 2n 1 (1) n x 3! 5! (2n 1)!
对于x∈[0,π]而言,上面两式的收敛性都不成问题。 对于求sin(x)的近似值来说,无论是计算量,还是误差 控制,利用后面一个公式计算的优越性更多一些。
3.5 三角函数值计算方法
•求任意角的三角函数值也是科学计算中经常遇到的
问题,利用三角函数的诱导公式,不难把任意角的 三角函数转化为锐角三角函数。
•由于tan(x)=sin(x)/cos(x),cot(x)=1/tan(x),所以只
要解决了sin(x)和cos(x)的精确的数值计算问题,其 它的三角函数的计算问题也就迎刃而解了。
•我们可以利用sin(x)和cos(x)的泰勒展式来求相应的
近似值,不过需要结合机器计算采用相应的技巧。
•我们的课堂上只介绍求sin(x)近似值的计算方法,其
余部分大家可以阅读教材,也可以在课后组织讨论。
1 正弦函数泰勒展式的处理方法
首先考虑正弦函数y=sin(x)在x∈[0,π]的函数值计 算问题。利用y=sin(x)在x=0处的泰勒展式
6.完整的算法说明
对于适当给定的x,(实际上可以假定|x|<π/4<1), 记 SINTV(x,eps)表示利用sin x的泰勒展式计算sin(x)的 近似值,且误差不超过eps的近似值,那么SINTV(x, eps)的完整算法可以表述为:
double SINTV(double x, float eps) { n=SINTRN(x,eps); return x*SINTNV(x,n); } 实际还有许多细节问题,大家可以进一步参看教材 中的处理方法,也可借鉴作者的思想寻找自己的方法。
4.秦九韶算法
可以把多项式改写为便于递推的形式 A(x)=( a0+ x(…(ak+x(…(an-1+x(an))…))…)) 记 yk=(ak+x(ak+1+x(…(an-1+x(an))…))) 约定yn=an,不难得到递推关系式 yn=an yk=ak+x*yk+1,k=n-1,n-2,…,0 且y0就是所需要的结果。 利用上面的递推格式求多项式的值的算法称为秦 九韶算法,一些国外文献称之为Horner算法,其实是 我国南宋时期的数学家秦九韶首先提出来的。
3.2多项式与有理函数值计算方法
对于一般形式的多项式 A(x)=a0+a1x+…+anxn 如果把它看成一般意义下的实函数而涉及到求数值结 果时,可以用更易于编程的形式把它表示为 PolyValue(x,A,n)= a0+a1x+…+anxn 其中A是(2.1)式给出的多项式A(x)的系数构成的(行)向 量,亦即 A=(a0,a1,…,an) 程序设计时,可以把A说明为一个n+1维数组,此时 约定A[0]存放a0,A[1]存放a1,…,A[n]存放an。
而且有SINTNV(x,n)=y1。 计算源代码见教材第54页程序3.06。
5.根据精度要求确定项数n
对于给定的n值,利用SINTNR(x,n) 作为sin(x)/x的近似值, 根据莱布尼兹级数理论,截断误差Rn(x)满足关系式 Rn(x)≤x2n/(2n+1)!≤x2n/(2n)! 为此,我们记
明一个临时变量power存放x的各次幂,并利用xk=xxk-1 来简化计算。我们把这种算法称为逐项求和算法。
逐项求和算法实际上特别简单,直接阅读教材第
45页的程序3.01的源代码即可掌握这个算法。
3 程序3.01 逐项求和法求多项式的值
double PolyValue(double x,double*A,int n) { double power=1.0,y; int k; y=A[0]; for(k=1;k<=n;k++) { power*=x; y+=A[k]*power; } return y; } 注释:程序3.01由于循环体内出现了两次乘法运算,所 以计算量为O(2n)。
n2 x )n, x (RNTNIS !)n2(
则对于给定的x∈[0,π]以及ε>0,可以通过求解下面的不等式 SINTNR(x,n)<ε 来寻找所需要的n。记 SINTRN(x,ε)=min{n|SINTNR(x,n)<ε} 我们不难编写一个小程序来计算SINTRN(x,ε)。源代码见教材第 55页程序3.07。
对于求x1来说,可以把分子有理化,从而得到
x1 2c b sign( b) b 2 4ac
3.求数值解的具体方法
如果记
b sign( b) b 4ac Quad( a, b, c) 2
2
那么x1,x2还可进一步简单地表示为 x1=c/Quad(a,b,c),x2=Quad(a,b,c)/a 其中x1,x2分别为一元二次方程的绝对值较小,较大的 根。 求解Quad(a,b,c)的c语言函数可以说明为 double Quad(double a,double b, double c) 完整的源程序见教材第52页程序3.05。
• 大家应该特别注意的是,利用泰勒展式计算函数值只是在一
个较小的范围内效果比较好,对于超出这个范围的问题来说, 还需采用一些其他的数学方法对问题作适当的处理。
3.1 引言:研究的意义
在微积分学中,幂函数、指数函数、对数函数、 三角函数、以及反三角函数统称为基本初等函数。 由基本初等函数经过有限次四则运算和复合运算所形 成的函数称为初等函数。 结论:我们只要要解决了基本初等函数值计算问 题,也就是如何经过有限步的四则运算得所有基本初 等函数值的具有任意精度的近似值,计算问题初等函 数的求值计算问题。
x2 x2 x2 1 1 1 记 yk (2k )( 2k 1) (2n 2)( 2n 1) (2n)( 2n 1)
可以立即得到如下的递推格式:
yn 1 1 x2 yk 1.0 (2k )( 2k 1) yk 1 , k n, n 1, ,1
3.6 对数函数值计算方法
求对数函数值最关键的问题实际上是计算[1,2]内的 数的自然对数。 对于计算大于2的数x的对数来说我们总可以找到整 数K,使得2K<x< 2K+1,记u=x/2K,则有1<u<2, ln(x) =ln(2Ku)=Kln(2)+ln(u) 此时还有1<u<2。 对于计算(0,1)内的数的对数来说,我们也可以利用 ln(x)=-ln(1/x) 把它化为求大于1的数的对数问题。 求一般的对数来说,我们总可以利用换底公式转化 为自然对数的计算问题。
5 程序3.02 秦九韶算法求多项式的值
double PolyValue(double x,double*A,int n) { double y; int k; y=A[n]; for(k=n-1;k>=0;k--)y=y*x+A[k]; return y; }
•由于不需要保留yn,yn-1,…,y1等中间结果,所以 程序中只用一个变量y来动态地表示它们。 •秦九韶算法的循环体内只有一次乘法运算,所以算
3.1 引言:研究的意义
尽管各种程序设计语言都提供了基本初等函数求
值计算的子程序或库函数,但是完全依赖程序设计语
言提供的子程序或库函数进行计算还是存在一些潜在 问题,而且也未必能满足所有实际工程计算的需要。 作为数值计算方法的研究,也需要从算法到计算 的实践解决微积分学中遗留的各种计算问题,并得到 可靠的结果。
• 提示:在我们的课程中,把数学函数名,求数值解
的算法名,求数值解的C语言函数名形式上处理得 基本相同,有利于把数学问题,求解的算法,C语 言代码联系在一起,形成比较完整的、有效的,易 于理解的求数值解方法。
2 逐项求和算法
求PolyValue(x,A,n)的数值解最容易想到的方法是按
次数由低到高的顺序逐项求和。为此可以在程序中说
7 一般有理函数的计算方法
在一般情况下,任何一个有理函数总可以表为两
个多项式函数的比。所以有了计算多项式的值的程序,
再来求有理函数的值就很容易,只要得到作为分子、 分母的多项式的值,它们的比值即可得到。 利用第7章介绍的方法,可以先把有理函数化为 一个多项式与一个既约真分式的和的形式,然后再求
数值解,相应的数值性能就会更好一些。
2.计算sin(x)近似值的数学形式
记SINTNV(x,n)表示利用sin(x)/x来自百度文库泰勒展式取前 n+1项之和作为sin(x)/x的近似值,亦即
x2 x4 x 2n SINTNV( x, n) 1 (1) n 3! 5! (2n 1)! 可以立即得到
sin(x)≈x[SINTNV(x,n)] 不难理解,在一定条件下,n值取得愈大,利用上面两 式得到的sin(x)的近似值的精度愈高。 所以,我们接下来的问题是SINTNV(x,n)数值计算方法 以及如何根据精度要求确定n值。
的办法来解决。
•大家可以可后阅读教材中的源代码,也可以等到学
习第5章时再回过头来研究。
3.4 一元二次方程求根方法
对于标准形式的一元二次方程 ax2+bx+c=0,a≠0 的求根公式
x b b 2 4ac 2a
不失一般性,可以假定b2-4ac>0,b≠0,这样,方程便 有两个不相等的实根,上式的分子中存在同号两数相 减的运算,如果按这个公式编写通用的应用程序,在 特定的情况下会产生较大的“过失”误差,所以只得 专门研究。
2.一元二次方程根的表示方法
假如一元二次方程有绝对值不同的两个实根, 记sign(b)表示取b符号,记x1为绝对值较小的那一个实 根,也就是分子是同号两数相减的那一个;x2为绝对 值较大的那一个实根,从而有
b sign( b) b 2 4ac x1 2a
b sign( b) b 2 4ac x2 2a
法的计算量为O(n),相当于程序3.01的一半。
6 秦九韶算法的补充说明
•对于过去人们用手工计算来说,能节省一半的计算
量是很有意义的。如果现在利用高性能计算机机算 还在于节省一半的计算量,显然没有实际意义。
•秦九韶算法现在已经越来越受到重视,还有更重要
的原因。假设计算一个基于泰勒展式的多项式的值, 不失一般性可以假设它的各项都是正的,注意到级 数收敛的必要条件是它的通项将趋近于零。当计算 的项数比较大时采用秦九韶算法可明显地提高精度 (实际计算表明可以保证精度)。
第3章 常用函数值计算方法
• 本章重点研究基本初等函数值的计算问题,从理论倒算法,
再到编程计算的实践解决了如何利用有限步的四则运算,得 到微积分学中基本初等函数的具有任意精度的近似值。
• 对于计算机本初等行素质来说,基本方法还是利用泰勒展式
进行计算,基本方法是对泰勒展式作适当变形,根据精度要
求确定项数,采用效率更高的递推方法求多项时的值。
3.SINTNV(x,n)数值计算方法
SINTNV(x,n)可以改写为
x2 x2 x2 1 1 SINTNV( x, n) 1 2 3 (2n 2)( 2n 1) (2n)( 2n 1)
1.求数值解的c语言函数说明
对于数值计算问题来说,作为应用程序,专门编 写计算PolyValue(x,A,n)的数值结果的C语言函数还是 很有意义的,为此,可以把相应的C语言函数说明为 double PolyValue(double x,double*A,int n)
其中x为自变量;*A为A[0]的地址;n为多项式的次数。