参数三次埃尔米特插值实例分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
公式推导
参数三次曲线,简称 PC 曲线,表示为: ������(t) = ������0 + ������1 t + ������2 ������ 2 + ������3 ������ 3 , ������ ∈ [0,1] 确定四个系数矢量的方法是给定曲线两端点及其切矢。 对函数中参数 t 求导,得: ������������ ������′ (������) = = ������1 + 2������2 ������ + 3������3 ������ 2 ������������ 用������ = 0,1代入以上两式,得: ������0 = ������(0) ������0 + ������1 + ������2 + ������3 = ������(1) ������1 = ������′ (0) ������1 + 2������2 + 3������3 = ������′ (1) 写成矩阵形式: ������(0) 1 0 0 0 ������0 ������ ������(1) 1 1 1 1 1 [ ] [������ ] = ′ ������ (0) 0 1 0 0 2 ������ 0 1 2 3 3 [������′ (1)] 于是可得: ������0 1 0 0 0 ������(0) ������1 0 0 1 0 ������(1) [������ ] = [ ] 2 −3 3 −2 −1 ������′ (0) ������3 2 −2 1 1 [������′ (1)] 将上式代入函数方程,得: 1 0 0 0 ������(0) 0 0 1 0 ������(1) ������(t) = [1 ������ ������ 2 ������ 3 ] [ ] −3 3 −2 −1 ������′ (0) 2 −2 1 1 [������′ (1)] 上式即与标量形式的三次埃尔米特插值相对应的参数形式,即定义在区间������ ∈ [0,1]
-60 -8
图 5 等距划分为 30 段时的插值曲线
被插函数y=0.34*x. +3*x,姓名: 彭茂武 学号:2018210378 35 30 25 20
3
Y轴
15 10 5 0 -5 数据点 被插曲线 插值曲线 0 0.5 1 1.5 2 X轴 2.5 3 3.5 4
图 6 等距划分为 30 段时的插值曲线放大图(������ ∈ [0,4])
x0=linspace(-5,5,N+1); %将被插函数成N段 x=-5:0.2:5; y=0.34*x.^3+3*x ; %被插函数 y0=0.34*x0.^3+3*x0 ; plot(x0,y0,'r.',x,y,'-.'); %绘制被查函数与数据点 hold on; bX = zeros(N,1); bY = zeros(N,1); for i=1:N-1 %给矩阵赋值 A(i,i)=4; bX(i) = 3*(x0(i+2)-x0(i)); bY(i) = 3*(y0(i+2)-y0(i)); if i<N-1 A(i,i+1)=1; A(i+1,i)=1; end end X=Guass(A,bX); %高斯消元法求出各点切矢 Y=Guass(A,bY); X=[0;X;0]; Y=[0;Y;0]; for j=1:N x1=x0(j); x2=x0(j+1); %横坐标 y1=y0(j); y2=y0(j+1); %纵坐标 x1_=X(i); x2_=X(i+1); y1_=Y(i); y2_=Y(i+1); %切矢 t=linspace(0,1,32); %插值细分量 H=[(t.^0)',t',(t.^2)',(t.^3)']*[1,0,0,0;0,0,1,0;-3,3,-2,-1;2,2,1,1]*[x1,y1;x2,y2;x1_,y1_;x2_,y2_]; %分段参数三次埃尔米特参数插值 plot(H(:,1),H(:,2),'-k'); hold on; end xlim([-8 8]); xlabel('X轴'); ylabel('Y轴'); legend('数据点','被插曲线','插值曲线',0); title('被插函数y=0.34*x.^3+3*x '); 5.3 高斯消元法 matlab 代码
5
5.1
附录
两点参数三次埃尔米特插值 matlab 代码
x=[10 30]; y=[10 30]; %两端点坐标 x_=[15 5]; y_=[25 25]; %两控制点坐标 plot(x,y,'ok',x_,y_,'sk',x,y,'--b'); hold on; plot([x(1),x_(1)],[y(1),y_(1)],'r'); h1=plot([x(2),x_(2)],[y(2),y_(2)],'r'); hold on; t=linspace(0,1,16); %插值细分量 H=[(t.^0)',t',(t.^2)',(t.^3)']*[1,0,0,0;0,0,1,0;-3,3,-2,-1;2,-2,1,1]*[x(1),y(1);x(2),y(2);x_(1)x(1),y_(1)-y(1);x_(2)-x(2),y_(2)-y(2)]; %进行参数三次埃尔米特插值 plot(H(:,1),H(:,2),'-k'); xlim([0,45]); ylim([0,35]); xlabel('X轴') ylabel('Y轴') set(get(get(h1,'Annotation'),'LegendInformation'),'IconDisplayStyle','off'); legend('端点','控制点','弦线','控制点','插值曲线',0); title('两点参数埃尔米特插值 '); grid on; hold on; 5.2 N=30; 分段参数三次埃尔米特插值 matlab 代码
60
40
20
Y轴
0
-20
-40
数据点 被插曲线 插值曲线 -6 -4 -2 0 X轴 2 4 6 8
-60 -8
被插函数y=0.34*x. +3*x,姓名: 彭茂武 学号:2018210378 60
图 4 等距划分为 10 段时的插值曲线 3
40
20
Y轴
0
-20
-40
数据点 被插曲线 插值曲线 -6 -4 -2 0 X轴 2 4 6 8
0
图 3 插值曲线为自由曲线
4
分段参数三次埃尔米特插值
由以上两点参数三次埃尔米特插值的特点,我们可以对多个数据点进行 n 次两 点插值,然后将其组合成一条曲线,这种方法称为分段参数三次埃尔米特插值,其 中最大的问题是将 n 端三次参数曲线光滑拼接。 这里引出两端曲线光滑拼接的条件: 1.边界重合:前一段曲线的终点为后一段曲线的起点; 2.切向矢量连续:前一段曲线终点处的切矢等于后一段曲线起点处的切矢; 3.曲率连续:前一段曲线终点处的二阶切矢等于后一段曲线起点处的二阶切矢。 即: ������������ (1) = ������������ (0) ′ { ������′ ������ (1) = ������������ (0) ′′ ������′′ ������ (1) = ������������ (0) 对������(������) 求二阶导数得: 1 0 0 0 ������(0) 0 0 1 0 ������(1) ������′′ (t) = [0 0 2 6������] [ ] −3 3 −2 −1 ������′ (0) 2 −2 1 1 [������′ (1)] 将������ = 0,1代入得: ′ ′ ������′′ ������ (0) = −6������������ (0) + 6������������ (1) − 4������������ (0) − 2������������ (1) ′ ′ ������′′ ������ (1) = 6������������ (0) − 6������������ (1) + 2������������ (0) + 4������������ (1) 化简可得: ′ ′ ������′ ������ (0) + 4������������ (0) + ������r (1) = 3[������������ (1) − ������������ (0)] 上式即为两段三次参数曲线光滑连接的条件。 则 n 段三次参数曲线光滑连接的条件为: ′ ′ ������′ ������ = 1,2,3, ⋯ , n ������−1 + 4������������ + ������������+1 = 3[������������+1 − ������������−1 ], 利用这个公式,可以得到:
参数三次埃尔米特插值实例分析 1 前言
由前面学习的知识得知,多项式曲线在处理多点高次插值时会出现震荡的问题 (即 Runge 现象),使曲线的光滑度大打折扣,特别是在两端。而单一低次多项 式曲线难以描述复杂形状的曲线。故而,唯一选择就是将一段段低次曲线在满足一 定连接条件下拼接起来,这个过程生成的曲线称为组合曲线。相应用分片定义的曲 面称为组合曲面。由于人们不希望一条组合曲线包含太多段,且并非次数越低越 好,在实践中,设计人员逐渐总结得到三次曲线是一个较好的折中。因为参数三次 曲线是既可以带有拐点的平面曲线,又能生成空间曲线的次数最低的参数多项式曲 线。在参数三次曲线中,埃尔米特插值具备形式简单,物理意义明确,控制简单的 优点,故本次实验选用埃尔米特插值方法来进行分段插值。
′ ⃗ ,即������′ ⃗ 为0 0 = ������n−1 = 0,此时矩阵方程有解,使用高斯消元法即可解得一组解。
通过以上步骤求得每个数据点的切矢,以及知道他们的坐标,即可进行分段参 数三次埃尔米特插值,这里以������ = 0.34������ 3 + 3������为被插曲线,使用等距参数化取得 数据点进行插值,插值曲线如下图所示: 3 被插函数y=0.34*x. +3*x,姓名: 彭茂武 学号:2018210378
上的参数三次埃尔米特插值。
3
两点参数三次埃尔米特插值
由以上公式可知,给定两端点及端点处的切矢,可以用参数三次埃尔米特方法 进行插值。分为三种情况如下图所示: 两点参数埃尔米特插值,姓名: 彭茂武, 学号:2018210378
35 30
25
20
Y轴
15 10
5
端点 控制点 弦线 控制点 插值曲线 0 5 10 15 20 X轴 两点参数埃尔米特插值,姓名: 彭茂武, 学号:2018210378 25 30 35 40 45
������′ 3( ������2 − ������0 ) − ������′ 1 0 ������′ 3(������ − ������ ) 3 1 2 = ∙ ∙ ∙ ∙ 1 ∙ ∙ ′ ′ ] ( ������ [ 3 ������ − ������ 1 4 [ ������−2 ] ������−1 ������−3 ) − ������n−1 )] 其中有 n 个未知数,n-2 个方程,所以无法求得解,把两个端点看成自由点,即切矢 4 1 1 4 1 1 ∙ ∙ [
function X=Guass(A,b)
n=size(A,1); X=zeros(n,1); for j=1:n-1 T=[]; a=A(j:n,j); m=find(abs(a)==max(abs(a))); A([j,m(1)+j-1],:) = A([j+m(1)-1,j],:); [b(j), b(j+m(1)-1)] = deal(b(m(1)+j-1),b(j)); for i=1:n-j T(i)=-A(i+j,j)/A(j,j); A(i+j,:)=A(i+j,:)+A(j,:)*T(i); b(i+j)= b(i+j)+b(j)*T(i); end end for i=n:-1:1 sum=0; for j=n:-1:i+1 sum=sum+X(j)*A(i,j); end X(i)=(b(i)-sum)/A(i,i); end
0
图 1 插值曲线为直线
35
30
25
20
Y轴
15 10
5
端点 控制点 弦线 控制点 插值曲线 0 5 10 15 20 X轴 25 30 35 40 45
0
图 2 插值曲线为抛物线
两点参数埃尔米特插值,姓名: 彭茂武, 学号:2018210378 35
30
25
20
Y轴
1源自文库 10
5
端点 控制点 弦线 控制点 插值曲线 0 5 10 15 20 X轴 25 30 35 40 45