《数值计算》学习笔记(上)

本文详细介绍了数值计算的基础方法,包括离散化、插值、逼近和迭代法。同时,深入探讨了误差来源、类型及基本概念,如绝对误差和相对误差。针对多项式、三角函数、对数和指数函数的计算,提供了泰勒展开式和高效算法。此外,讨论了求解函数零点和极值的区间对分法和黄金分割法。这些理论和方法对于数值计算的精确性和效率至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Chp1 数值计算概述

1.4 利用机器计算的基本方法

离散化方法
设f(x)是定义在[a,b]上的连续函数,当它们的表达式很复杂,甚至写不出来时,我们可以选择若干个离散点x0, x1,…, xn∈[a,b],求出f(x)在这些点处的函数值或函数值的近似值fi= f(xi) i=0,1,…,n, 从而得到一个如下的函数值列表:
在这里插入图片描述
插值方法
对于任意给出的某个函数y=f(x)的函数值列表,我们可以构造一个简单函数,比如n次多项式pn(x),满足条件pn(xi)=yi, i=0,1,…,n,并利用pn(x)近似表示f(x)。

逼近方法
设f(x)是满足某种特定条件的函数(比如在某个区间上连续可微、在某个区间上平方可积等),表达式比较复杂甚至写不出来,但是我们可以把它表示为一个简单函数系列{fn(x),n=1,2,…}的极限,即 Lim fn(x)=f(x) (n->∞)
这样我们就可以根据不同的精度要求选取适当大的正数N,利用fN(x)近似替代f(x)。

迭代方法
假如我们要计算出某个实际值x*,我们可以构造一个序列{xn,n=0,1,2,…},满足条件:x0 为已知值;有一个简单函数φ(t),且xn+1=φ(xn),n=0,1,2,…,lim xn=x* (n→∞)
那么,我们可以反复利用xn+1=φ(xn), 经过N 次迭代后,用xN+1作为x* 的近似值。

1.6关于算法的评价

程序的可读性好
节省计算时间
节省存储空间
数值稳定性好(提高收敛率,增强数值稳定性)


Chp2 误差分析

2.1 误差的来源与分类

过失误差,描述误差,观测误差,截断误差和舍入误差

过失误差:是由设备故障和人为的错误所产生的误差,在由于每个人都有“权利”利用机器进行数值计算,所以在计算方法研究领域应当强调怎样有效避免过失误差。

描述误差:为了便于数学分析和数值计算,人们对实际问题的数学描述通常只反映出主要因素之间的数量关系,而忽略次要因素的作用,由此产生的误差称为描述误差。对实际问题进行数学描述通常称为是建立数学模型,所以描述误差也称为是模型误差。(比如“忽略空气阻力”)

观测误差:描述实际问题或实际系统的数学模型中的某些参数往往是通过实验观测得到的。由试验得到的数据与实际数据之间的误差称为观测误差。(比如“重力加速度g,它在地球表面的不同位置以及不同高度的值是不同的”)

舍入误差:几乎所有的计算工具,当然也包括电子计算机,都只能用一定数位的小数来近似地表示数位较多或无限的小数,由此产生的误差称为舍入误差。

截断误差:是计算方法本身所产生的误差,所以在我们的课程中,重点还是考虑尽可能消除截断误差。与截断误差密切相连的数学知识是泰勒展式,我们经常会利用泰勒展式来消除截断误差。

注:我们的计算方法对于如何消除描述误差,观测误差和舍入误差无能为力,但是应当考虑尽量消除这些误差对计算结果的影响,也就是减少误差的传播。

2.2 误差的基本概念

误差,绝对误差,相对误差,绝对误差限,相对误差限,数的近似表示

定义:设x *为某个量的真值,x为 x *的近似值,称 |x *- x|为近似值x的绝对误差;称 |x *- x|/|x|为近似值x的 相对误差

既然在绝大多数情况下我们无法确定出真值x *,那么近似值x的误差、相对误差、以及绝对误差也都是无法确定的,但是我们总有办法估计出它们会落在那个范围之内。我们平时口语中所讲的误差,实际所指的都是误差限。

定义:设x为真值x * 的近似值:
若e>0满足条件|x*-x|≤e,则称e为x的绝对误差限(或误差限);
若er>0满足条件|x*-x|/|x|≤er,则称er为x的相对误差限。
提示:绝对误差限和相对误差限满足关系e = er·|x|
所以只要知道其中的任意一个,即可求出另外一个。

2.3 有效数

定义:如果真值x *的近似值x的绝对误差限是它的某一个数位的半个单位,则称近似值x准确到这一位,且这一位一直到最左边第一个非零数字为止的所有数字都称为有效数字,有效数字的个数称为有效数字的位数。
记号:若近似值x有p位有效数字,那么我们可以把x表示为
x=±0.x1x2…xp×10n(其中x1,x2,…,xp∈{0,1,…,9},且x1≠0)

四舍五入:
若x * 的近似值为x=±0.x1x2…xp×10n(其中x1,x2,…,xp∈{0,1,…,9},且x1≠0.)
如果要保留p位有效数字,(即|x*-x|≤0.5×10n-p)那么我们可以把x的小数点后的第p+1位四舍五入,称为使x保留p位有效数字。
在这里插入图片描述
在这里插入图片描述

2.4 利用微分估算误差(2.4.1和2.4.2)

结论:在微分公式df(x)= f’(x)dx中如果把|dx|解释为x的绝对误差(限),那么|df(x)|就是所得到的计算结果f(x)的绝对误差限。
当我们把f(x)的绝对误差(限)近似地表示为df(x)时,我们可以进一步得到f(x)的相对误差(限)为
在这里插入图片描述
结论:我们可以把|dln[f(x)]|作为f(x)的相对误差限的计算公式。
提示:虽然有时候f(x)可以取负值,但进行误差分析时,可以将它反号而不影响误差分析的结果。
在这里插入图片描述

2.6 近似计算的基本原则

1、由于现在计算机的性能有大幅度提高,所以应当尽量采用双精度数计算,把提高精度放在更为重要的位置。
2、应当尽量避免绝对值相近的两个正数相减,这样会吃掉许多有效数字位,这是计算方法中的头号杀手。
3、应当尽量避免绝对值较大的数除以绝对值较小的数,如前所述这样会产生较大的绝对误差,甚至导致计算机数字溢出。
4、应当防止“大数”吃“小数”,绝对值相差很大的两个正数相加或相减,由于是对位相加,所以小数会吃亏。大量的这样类似的计算会有些问题。
5、尽可能减少运算次数,防止误差扩散。


Chp3 常用函数值计算方法

3.2 多项式与有理函数值计算方法

逐项求和算法

//程序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)

秦九韶算法
总结:下一项=余项+公因子*上一项

//程序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来动态地表示它们。秦九韶算法的循环体内只有一次乘法运算,所以算法的计算量为O(n),相当于程序3.01的一半。避免了大数吃小数的问题。
当计算的项数比较大时采用秦九韶算法可明显地提高精度。

3.5 三角函数值计算方法

正弦函数泰勒展式的求和方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//程序3.06 SINTNV(x,n)
#define PI 3.1415926535897932l
double SINTNV(double x,int N)
{ int K;  double y=1.0,xx=0.0,temp;
  K=N*2;
  xx=x*x;
  while(K>0)
  { y=1.0-y*xx/K/(K+1);
    K-=2;
  } 
 return y*x;}

余弦函数泰勒展式的求和方法:
在这里插入图片描述
在这里插入图片描述

//程序COSTNV(x,n)
#define PI 3.1415926535897932l
double COSTNV(double x,int N)
{ int K;  double y=1.0,xx=0.0,temp;
  K=N*2;
  xx=x*x;
  while(K>0)
  { y=1.0-y*xx/K/(K-1);
    K-=2;
  } 
 return y;}

3.6 对数函数值计算方法

对数函数泰勒展式的求和方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//程序3.12 LOGTNV(x,n) 
double LOGTNV(double x,int n)
{ int K,NK;    double xx,y;
  NK=n*2+1;    xx=x*x;
  y=1.0/NK;
  for(K=n;K>0;K--)
  { NK-=2;
    y =1.0/NK+xx*y;
  }  
  return y;
}

3.7 指数函数与幂函数值计算方法

指数函数泰勒展式的求和方法:
在这里插入图片描述
在这里插入图片描述

//程序3.16 EXPTNV(x,n)数值计算方法
double EXPTNV(double x,int N)
{ int K=0;
  double y=1.0;
  for(K=N;K>0;K--)
    y=1.0+y*x/K;
  return y;
}

Chp5 求函数的零点与极值问题

5.1 函数的零点与极值问题概述

零点定义:设f(x)是定义在闭区间[a,b]上的连续函数,如果x∈[a,b]使得f(x)=0,则称x*是f(x)的一个零点。
结论:由高等数学中的介值定理可知,如果f(x)是连续函数,而且f(a)·f(b)<0,则方程f(x)=0在[a,b]内一定有解。
如图所示,只要f(a)和(b)异号,函数的图像就一定在[a,b]内和x轴相交,也就是 f(x)=0在[a,b]内有解,从而找到了隔根区间。
在这里插入图片描述
求隔根区间的方法有
分析法:利用高等数学(数学分析)中的函数作图方法画出y=f(x)的大致曲线即可确定隔根区间;(学生最适用)
试算法:试探性地给出两个数a,b,若f(a)·f(b)<0,则试算成功,否则修改a或b,重新试算;(适用于数学经验丰富者)
搜索法:从某一点开始,按一定的步长分别向左或向右逐点计算,直到出现相邻两点函数值异号。 (适用于工程师)

极值点定义:设y= f(x)是定义在区间[a,b]上的连续函数,对于x∈(a,b),如果存在δ>0使得当|x-x * |<δ时,恒有f(x * )≤f(x),则称x是f(x)在(a,b)内的一个极小值点。

5.2 区间对分法

算法原理
直接取区间[a,b]的中点x=(a+b)/2作为问题的近似解.那么绝对误差限仅为区间长的一半.即e=(b-a)/2.
如果这个结果能满足精度要求,我们就停止进一步的计算;如果不能,就求出f(x),结果只能是下面三种情况之一:
f(a)·f(x)<0,此时我们有x* ∈[a,x];
f(x)·f(b)<0,此时我们有x*∈[x,b];
f(x)=0,此时x即为问题的精确解.
上面第三种情况一般不会发生,可以不予考虑.在前两种情况下,我们可以用x分别替换原问题中的b或a,从而把求解的区间减小了一半。这样我们又可以取新区间[a,b]的中点。
在这里插入图片描述
在这里插入图片描述

实例:
在这里插入图片描述
在这里插入图片描述
使用excel表格设置好各项的函数就可以逐行算出啦

5.3 黄金分割法

单峰函数的定义:设y= f(x)是定义在某区间[a,b]上的实函数,如果存在x ∈[a,b]使得f(x)在[a,x]上是单调减函数,而在[x*,b]上是单调增函数,则称f(x)是区间[a,b]上的单峰函数。
若f(x1)<f(x2),则x∈[a, x2]
若f(x1)>f(x2),则x
∈[x1,b]
若f(x1)=f(x2),则x*∈[x1, x2]
在这里插入图片描述
黄金分割点的求法
设[a,b]是一个线段或区间,x 是[a,b]上的一个(分割)点,如果两个子区间[a,x]和[x,b]的长度之比正好等于黄金比例,则称x是 [a,b]上的一个黄金点或黄金分割点。
在一条线段上与黄金分割点对称的那个点当然也称为是黄金分割点。
区间[a,b]上的两个黄金分割点x1,x2的几何位置,其计算方法是:
x2=a+0.618(b-a)
x1=a+0.618(x2-a)=a+0.382(b-a)
在程序设计中,可以用符号常数GOLDEN来表示黄金比值x2=2.0/(51/2+1),并取 GOLDEN=0.618033988749895。

算法说明:
设f(x)是区间[a,b]上的单峰函数,我们可以按下面的方寻找f(x)在[a,b]上的极小值点x*的近似值。
先计算[a,b]上的两个黄金分割点x1,x2处的函数值y1=f(x1)和y2=f(x2),接下来再根据y1和y2的值决定进一步的操作。
若y1<y2,则在区间[a,x2]上求极小值点,此原来的x1已经是新区间上右边的一个黄金点,可改记为x2,相应的函数值也改记为y2,不难找到新区间的另一个黄金分割点x1,并得到相应的函数值y1。
若y1>y2,则可以在区间[x1,b]上用类似的方法求极小值点。
无论出现什么情况,搜索的范围缩小了38.2%,所以,经过有限步的计算,总能得到所需要的精度的近似解。

如图所示,为了求单峰函数y=f(x)区间[a,b]内的最小值点,首先找到[a,b]内的两个黄金点x1,x2,并比较函数值f(x1)和f(x2)。由于有f(x1)<f(x2),所以接下来只需找出[a,x2]内的另一个黄金点x3即可与x1作进一步的比较。
在这里插入图片描述

实例:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值