数值分析方法 课件 第三章 数值逼近基础_第1页
数值分析方法 课件 第三章 数值逼近基础_第2页
数值分析方法 课件 第三章 数值逼近基础_第3页
数值分析方法 课件 第三章 数值逼近基础_第4页
数值分析方法 课件 第三章 数值逼近基础_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数值分析方法面向“四新”人才培养普通高等教育系列教材第三章数值逼近基础3.1插值逼近3.2曲线拟合3.3Python程序在数值逼近中的应用

目录/Contents

3.1插值逼近

插值法基本原理代数插值法几何意义

插值问题解存在唯一性

证明:

3.1.2拉格朗日(Lagrange)插值法

类似于线性插值基函数的方法,构造满足条件的二次插值基函数:拉格朗日(Lagrange)插值法插值多项式的误差估计证明:3.1.3Newton插值法差商定义性质3.1.1性质3.1.2性质3.1.3性质3.1.4差商性质Newton插值公式

差商与导数的关系泰勒公式带余项的Newton插值公式解

先构造差商表

故Newton线性插值多项式为所求近似值为

Newton二次插值多项式为

所求近似值为

由性质3.1.4差商与倒数的关系,估计插值的截断误差为3.1.4等距节点的Newton插值公式插值点等距(即

),Newton插值公式将得到简化差分的概念差分与差商的关系考虑到节点时等距的,由差商与向前差分的定义,有等距节点的Newton插值公式例3.1.4

给出余弦函数表如下,试分别用牛顿前差和后差公式计算cos0.048及cos0.566的近似值,并估计误差.解:作差分表

3.1.5Hermite插值Hermite插值多项式的构造Hermite插值多项式的余项估计

Hermite的插值多项式为由插值余项的误差估计可以看出:插值多项式与被插函数的逼近程度,与插值节点的数目和位置有关,一般地,节点越多,逼近程度越好。但也有例外,考察函数3.1.6分段线性插值

将插值区间分成若干个小的区间,在每个小区间使用低次插值,然后将每个小区间上的插值多项式相互连接,得到整个区间上的插值函数,这种把插值区间分段的方法就是分段低次插值法.采用基函数方法来构造分段线性插值函数它们的几何图形如图所示,它们具有局部非零性由分段线性插值基函数得区间(a,b)上的分段线性插值函数为

分段三次Hermit插值

3.1.7三次样条插值三次样条函数的构造定义3.3构造三次样条插值函数通常有两种方法:(1)给定插值节点处的二阶导数值作为未知数来求解.在工程上称二阶导数为弯矩,这种方法成为三弯矩插值.(2)是以给定插值节点处的一阶导数作为未知数来求解,而一阶导数又称为斜率,这种方法称为三斜率插值.三次样条函数的求法满足第一边界条件的三弯矩方程组该方程组同样也是严格对角占优方程组,利用追赶法可以解得唯一解

定理3.63、递推化:把复杂的计算归结为简单过程的多次重复计算,易于用循环结构来实现(如迭代法)谢谢!数值分析方法主编

李冬果李林高磊面向“四新”人才培养普通高等教育系列教材第三章数值逼近基础3.1插值逼近3.2曲线拟合3.3Python程序在数值逼近中的应用

目录/Contents

3.2曲线拟合设实验获得的某函数关系y=f(x)在某些离散点上的函数值为

3.2.1线性拟合例

试根据以下实验数据做拟合函数解:表中数据作一草图,可以看出表中数据分布可以用以直线来近似描述.设所求的

拟合曲线为3.2.2多项式拟合系数矩阵是对称阵,该方程组存在唯一解例

试根据以下实验数据做拟合函数解:表中数据作一草图,可以看出表中数据分布可以用以抛物线来近似描述.设所求

的拟合曲线为可化为线性拟合的非线性拟合类型曲线拟合方程图形变换关系变换后线性拟合方程幂函数

指数函数

双曲线函数

类型曲线拟合方程图形变换关系变换后线性拟合方程对数函数

Logistic模型

Gomperty模型

3、递推化:把复杂的计算归结为简单过程的多次重复计算,易于用循环结构来实现(如迭代法)谢谢!

数值分析方法主编

李冬果李林高磊面向“四新”人才培养普通高等教育系列教材第三章数值逼近基础3.1插值逼近3.2曲线拟合3.3Python程序在数值逼近中的应用

目录/Contents

3.3Python程序在数值逼近中的应用差值算法Python实验拉格朗日(Lagrange)插值法Newton差值法的实现拟合算法Python实验线性拟合多项式拟合Python中的插值函数Numpy工具包中interp、ployfit、polyval等SciPy工具包中interpolate、curve_fit等拉格朗日(Lagrange)插值法deflagrange_interp(x_data,y_data,x_value):

n=len(x_data)

y=0

foriinrange(n):

p=1

forjinrange(i):

p=p*(x_value-x_data[j])/(x_data[i]-x_data[j])

forjinrange(i+1,n):

p=p*(x_value-x_data[j])/(x_data[i]-x_data[j])

y=y+y_data[i]*p

returny参数x_data和y_data是插值点的自变量和函数值,x_value是待求差值函数值的自变量值,为了同步计算多个点的差值函数值,x_value可以使用NumPy数组importnumpyasnpx_data=np.array([100,121,144],dtype=np.float64)y_data=np.sqrt(x_data)lagrange_interp(x_data,y_data,np.array([115]))结果为:array([10.72275551])对比真值:>>>np.sqrt(115)10.723805294763608defget_divided_differences(x,y):

n=len(x)

dd_matrix=np.zeros((n,n),dtype=float)

dd_matrix[:,0]=y

forjinrange(1,n):

foriinrange(j,n):

dd_matrix[i,j]=\

(dd_matrix[i,j-1]-dd_matrix[i-1,j-1])/(x[i]-x[i-j])

returndd_matrixNewton插值法函数中的符号“\”是Python中的换行提示符首先编写差商表计算函数>>>f=lambdax:x**7+x**4+3*x+1>>>x_data=[2**iforiinrange(9)]>>>x_data=np.array(x_data,dtype=np.float64)>>>y_data=f(x_data)>>>dd_matrix=get_divided_differences(x_data,y_data)>>>dd_matrix[7,7]1.0>>>dd_matrix[8,8]0.0编写Newton差值法的函数Newton插值法defnewton_interp(x_data,y_data,x_value):

n=len(x_data)

dd_matrix=get_divided_differences(x_data,y_data)

p=dd_matrix[n-1,n-1]

forkinrange(n-2,-1,-1):

p=dd_matrix[k,k]+(x_value-x_data[k])*p

returnp>>>x_data=np.array([100,121,144,169],dtype=np.float64)>>>y_data=np.sqrt(x_data)>>>newton_interp(x_data,y_data,115)10.723574251835121Numpy工具包中有一个基本的差值函数interp,而SciPy工具包更是包含一个专门的子包interpolate用于插值计算。这些包含了多种分段插值方法的实现,如常用的分段线性插值函数,三次样条插值类等。插值函数的使用

解:本题可以由如下代码完成:importnumpyasnpfromscipyimportinterpolatex=np.linspace(0,2*np.pi,9)y=np.sin(x)spl=interpolate.CubicSpline(x,y)x_value=np.linspace(0,2*np.pi,100)y_value_spl=spl(x_value)y_value_lin=erp(x_value,x,y)spl是由erpolate.CubicSpline和节点数据计算出的差值函数y_value_spl即为三次样条插值的结果y_value_lin则是由函数numpy.interp计算出的线性插值结果。通过matplotlib绘出插值图像:importmatplotlib.pyplotaspltplt.figure(figsize=(8,6),dpi=600)plt.plot(x,y,'kd')plt.plot(x_value,y_value_lin,'k:')plt.plot(x_value,y_value_spl,'k-')plt.legend(['Nodes','Linear','CubicSpline'])plt.show()线性拟合deflin_fit(x,y):

n=len(x)

s_x=sum(x)

s_y=sum(y)

s_xy=sum(x*y)

s_x2=sum(x**2)

a0=(s_x2*s_y-s_x*s_xy)/(n*s_x2-s_x**2)

a1=(n*s_xy-s_x*s_y)/(n*s_x2-s_x**2)

returna1,a0本例中涉及NumPy数组的运算,参数中的x和y须是数组才能正确运行例

试根据以下实验数据做拟合函数>>>x_data=np.array([1.36,1.37,1.95,2.28])>>>y_data=np.array([14.094,16.844,18.475,20.963])>>>lin_fit(x_data,y_data)(5.853760129659651,7.408457374392223)多项式拟合importnumpyasnpfromscipyimportlinalgasla

defpoly_fit(x,y,n):

n=n+1

s_x_list=np.array([sum(x**i)foriinrange(2*n)])

s_xy_list=np.array([sum(x**i*y)foriinrange(n)])

A=np.zeros((n,n))

foriinrange(n):

A[i,:]=s_x_list[i:(i+n)]

s_xy_list.reshape((n,1))

a_list=la.inv(A)@s_xy_list

returna_list[::-1]为了简便计算,在函数中直接调用的scipy.linalg.inv函数,并用NumPy矩阵运算计算了线性方程组的解。最后返回结果按照降幂排列例

试根据以下实验数据做拟合函数>>>x_data=np.array([0,1,2,3,4,5],dtype=np.float64)>>>y_data=np.array([5,2,1,1,2,3],dtype=np.float64)>>>poly_fit(x_data,y_data,2)array([0.5

,-2.78571429,

4.71428571])拟合函数的使用在NumPy工具包中提供了polyfit函数,用于一般的多项式拟合;NumPy还提供了函数polyval用于求系数向量形式的多项式函数值例

试根据以下实验数据做拟合函数>>>np.polyfit(x_data,y_data,2)a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论