数值计算方法第四章第四节 三次样条
- 格式:ppt
- 大小:796.50 KB
- 文档页数:45
数值分析三次样条插值函数【问题】对函数f x =ex, x∈[0,1]构造等距节点的三次样条插值函数,对以下两种类型的样条函数1. 三次自然样条2. 满足S′ 0 =1,S′ 1 =e的样条并计算如下误差:max{ f x1 −S x1 ,i=1,…,N} i−i−i这里xi−1为每个小区间的中点。
对N=10,20,40比较以上两组节点的结果。
讨论你的结果。
【三次样条插值】在每一个区间[t1,t2],…,[tn−1,tn]上,S都是不同的三次多项式,我们把在[ti−1,ti]上表示S的多项式记为Si,从而,S0 x x∈[t0,t1]∈[t1,t2] S x = S1 x x…Sn−1 x x∈[tn−1,tn]通过在节点处函数值、一阶导数和二阶导数的连续性可以得到:Si−1 ti = yi= Si ti 1≤i≤ n−1Si−1′ ti = Si′ tix→ti+limS′′ x =zi=limS′′(x) x→ti−再给定z0和zn 的值就构成了4n个条件,而三次样条插值函数共4n个系数,故可以通过这4n个条件求解三次样条函数的系数,从而求得该三次样条插值函数。
特别的,当z0=zn=0 时称为自然三次样条。
文本预览:一、自然三次样条插值【自然三次样条插值算法】1.由上面的分析可知,求解三次样条函数实际上就是求解一个矩阵:u 1h 1h1u2h2h2u3…v1 z1 v2 z2 z3=v3 … z…hn−2 n−2 vn−2 z vn−1 un−1 n−1ih3…hn−3un−2hn−26…其中hi=ti+1−ti,ui=2(hi+hi−1),ui=h(yi+1−yi),vi=bi−bi−1 所以自然三层次样条插值的算法就是在得到端点的函数值,一次导数值和二次导数值,然后根据上述求解矩阵得到v,代入自然三次样条的表达式即可。
2.根据题目中所给出的误差估计,计算在区间中点处的最大误差。
【实验】通过Mathematica编写程序得到如下结果:N=101. 计算得到zi的值为:由此可以得到各个区间的自然三次样条插值函数。
三次样条插值求导法在数学和计算机科学领域中,样条插值是一种常用的数值计算方法,用于通过一系列已知的数据点来构造一条平滑的曲线。
在实际应用中,我们经常需要对这些曲线进行求导,以便进一步分析和处理数据。
三次样条插值是一种特殊的样条插值方法,它使用三次多项式来逼近数据点之间的曲线。
与线性插值方法相比,三次样条插值的优势在于它能够产生更平滑的曲线,并且在曲线的一阶导数和二阶导数上连续。
三次样条插值的求导方法可以通过两种方式进行:一种是通过求导的公式,另一种是通过样条插值的控制点求导。
首先,我们来看一下通过求导的公式来进行三次样条插值的导数计算。
对于每个插值段,我们可以表示为一个三次多项式的形式:S(x) = a + bx + cx^2 + dx^3,其中 a、b、c、d 是需要确定的系数。
在插值段的两个端点,我们可以通过已知的数据点来确定一些限制条件,例如函数值、一阶导数和二阶导数的值。
通过这些限制条件,我们可以得到一个线性方程组,通过解这个方程组可以确定每个插值段的系数。
当我们确定了系数之后,就可以利用求导的公式来计算任意一点的导数值。
对于三次多项式 S(x),它的导数可以表示为 S'(x) = b + 2cx + 3dx^2。
除了通过求导的公式,我们还可以通过样条插值的控制点来计算导数。
在三次样条插值中,除了已知的数据点之外,还有一些控制点,用于调整曲线的形状。
通过调整这些控制点,我们可以影响插值曲线的形态。
为了计算导数,我们可以对控制点进行微小的调整,然后重新构造插值曲线。
通过计算插值曲线在数据点处的斜率,我们可以得到导数的近似值。
通过反复调整控制点,不断逼近导数的准确值。
需要注意的是,通过控制点求导的方法只能得到导数的近似值,而不是准确值。
这是因为样条插值是一种近似方法,对于某些曲线,通过控制点调整可能无法完全准确地反映曲线的变化。
因此,当精确的导数值是必需的时候,最好使用求导的公式来计算。
三次样条插值算法详解下面详细介绍三次样条插值方法的具体步骤:1.数据准备:首先,需要获得一组数据点,这些数据点包含了所需插值曲线的关键信息。
通常情况下,数据点是从实际观测中获得的。
2.区间划分:将插值区间划分为若干个小区间,每个小区间对应一个三次函数。
3. 函数构建:对于每个小区间,在该区间内构建一个三次函数。
这里使用三次多项式进行构建,形如 f(x) = ax^3 + bx^2 + cx + d。
每个小区间内的函数有四个待定系数:a、b、c、d。
4.条件设置:为了确定每个小区间内的函数,需要设置相应的条件。
一般来说,需要满足以下两个条件:(a) 函数值条件:保证每条小区间内的函数值通过对应的数据点。
即,对于每个小区间,函数值满足 f(xi) = yi,其中(xi, yi)表示第i个数据点的横纵坐标。
(b)导数条件:保证每个小区间内函数的导数连续。
这可以通过限制每个小区间内的函数的一阶导数(即斜率)相等来实现。
5.矩阵方程求解:根据上述条件设置,可以得到一个线性方程组,其中待求的系数为未知数。
将上述条件代入方程组中,然后求解该方程组以获得每个小区间内的函数系数。
6.曲线绘制:通过得到的函数系数,可以计算每个小区间内的函数值,并连接这些函数值,最终得到整个插值曲线。
三次样条插值方法是一种非常强大和灵活的插值方法,适用于各种类型的数据点,包括均匀和非均匀间距的数据。
通过调整划分区间的个数,可以控制插值曲线的光滑程度。
一般来说,插值区间越多,插值曲线越平滑,但对输入数据的噪声更敏感。
总结起来,三次样条插值是一种高级的插值方法,通过构建三次函数来逼近数据点,可以产生平滑的插值曲线。
它的基本思想是将插值区间划分为若干个小区间,并在每个小区间内构建一个三次函数。
通过设置函数值条件和导数条件,可以得到一个线性方程组,从而求解出每个小区间内的函数系数。
最终连接每个小区间内的函数值,得到整个插值曲线。
一、实验目的和要求(1) 掌握三次样条方法的原理,加深对插值方法的理解。
(2) 理解三次样条在高次差值的逼近效果比多项式的优越性!(3) 能构造出正确的算法结构并能实现具体问题的计算。
二、实验内容和原理实验内容:三次样条插值 解决具体问题:对于函数 ,取等距节点5,0,1,,10i i i x =-+= ,设已给出节点上的函数值以及左右两个端点的一阶导数值,按上述算法进行样条插值。
实验原理:(1)、三次样条的定义:设在[a,b]上有n+1个节点,f(xi)= yi,i=0,1,2,…,n 。
若S3(x)满足1) S3(x)在每个[xi,xi+1](i=0,1,…,n-1)上是不高于三次的多项式;2) S3(x), , 在[a,b]上连续;3) S3(xi)=yi(i=0,1,…,n)。
则称S3(x)为f(x)关于节点x0,x1,…,xn 的三次样条插值函数。
(2)、三次样条插值函数的边界条件:待定系数个数:4n已知条件:补充条件:这两个条件通常在区间[a,b]的两个端点给出,称为边界条件(3)、三次样条插值函数的求法:21()1f x x =+)('3x s )(''3x s 3333333(),(0,1,)(0)(0),(1,2,1)(0)(0),(1,2,1)(0)(0),(1,2,1)i i i i ii i i S x y i n S x S x i n S x S x i n S x S x i n ==⎧⎪-=+=-⎪⎨''-=+=-⎪⎪''''-=+=-⎩ 3011011i i+1i i i+120212021()()()()()...(1)h =x -x , x x x ()(1)(21)()(23)()(1)()(1)i i i i i i i i i i i i i i x x x x x x x x S x y y h m h m h h h h x x x x x x x x x x x x ϕϕψψϕϕψψ++----=+++≤≤=-+=-+=-=-得到系数矩阵,利用追赶法求解利用式(1)求解(4)、追赶法:追的过程(消元过程)赶的过程(回代过程)1,2,1][32)(322 111111111112121111111-=-++-+=++++⇔-+-=++++-----+----+⨯+--+----n i h y y h h h h y y h h h m h h h m m h h h h y y h y y h m m h m m ii i i i i i i i i i i i i i i i i i i i h h h h i i i i i ii i i i i i ii i i1,2,142624611211121-=++--=+------++n i h m m h y y h m m h y y i i i i i i i i i i i i ,)3......(..........2)1(2)1(2)1()1(211121212232232212011211⎪⎪⎪⎩⎪⎪⎪⎨⎧'-=+-=++-=++---=+-----------n n n n n n n n n n n n y αm m αm αm m αm αm m αy αm αm ββββ ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡---=---210212102122221n n n A αααααα三、算法框图与程序框图(1)、算法框图:(2)、程序框图三次样条追赶法四、实验数据#include <iostream> #include<iomanip>using namespace std; double x[100]={0}; double y[100]={0}; int N;int n;double M0,Mn; double c[100]={0}; double p[100]={0};double h[100]={0};double d[100]={0};double a[100]={0};double X;double G0,G1,W0,W1,S3;int main(){//输入数据cout<<"输入节点的数目";cin>>N;n=N-1;cout<<"输入各个节点以及节点的值";for(int i=0;i<=n;i++){cout<<endl<<setw(15)<<"x["<<i<<"]=";cin>>x[i];cout<<setw(15)<<"y["<<i<<"]=";cin>>y[i];}cout<<"输入两个端点的一阶导数值";cout<<endl<<setw(15)<<"M0=";cin>>M0;cout<<setw(15)<<"Mn=";cin>>Mn;//用(39)式计算值for(int i=0;i<n;i++)h[i]=x[i+1]-x[i];for(int j=1;j<n;j++){c[j]=h[j-1]/(h[j-1]+h[j]);p[j]=3*((1-c[j])*(y[j]-y[j-1])/h[j-1]+c[j]*(y[j+1]-y[j])/h[j]); // cout<<p[j]<<" ";}//用追赶法求解//表示d[i];d[0]=M0;d[1]=p[1]-(1-c[1])*M0;for(int i=2;i<=n-2;i++){d[i]=p[i];}d[n-1]=p[n-1]-c[n-1]*Mn;d[n]=Mn;//表示a[i];for(int j=2;j<=n-1;j++){a[j]=1-c[j];}//按照框图6-4计算,其中b[i]=2;double b=2;c[1]=c[1]/b;d[1]=d[1]/b;int k=0;double t=0;for(k=2;k<=n-2;k++){t=b-c[k-1]*a[k];c[k]=c[k]/t;d[k]=(d[k]-d[k-1]*a[k])/t;}d[n-1]=(d[n-1]-d[n-2]*a[n-1])/(b-c[n-2]*a[n-1]);for(int i=n-2;i>=1;i--){d[i]=d[i]-c[i]*d[i+1];}cout<<"各节点的导数值如下:"<<endl;for(int i=0;i<N;i++)cout<<"M["<<i<<"]="<<d[i]<<endl;cout<<endl<<"输入要求值点的X值:X="; cin>>X;int E=0;while(E<=n){if(E>=n){cout<<"输入有误";return 0;}if(x[E]<X&&X<x[E+1]){break;}elseE=E+1;}double R= (X-x[E])/h[E];G0=(R-1)*(R-1)*(2*R+1);G1=R*R*(-2*R+3);W0=R*(R-1)*(R-1);W1=R*R*(R-1);// cout<<n;// cout<<endl<<E;//cout<<"hahahhah";//cout<<G0<<endl<<G1<<endl<<W0<<endl<<W1<<endl<<(X-x[E])/h[E]<<endl<<d[E]<<endl <<d[E+1];S3=G0*y[E]+G1*y[E+1]+h[E]*W0*d[E]+h[E]*W1*d[E+1];cout<<endl<<S3;}/*4-1-11133561*//*11-5 0.03846-4 0.05882-3 0.10000-2 0.20000-1 0.500000 1.000001 0.500002 0.200003 0.100004 0.058825 0.038460.01479-0.01479*/。