matlab样条拟合插值后获得曲线方程

matlab提供了一些三次样条插值函数spline
以及样条工具箱函数,如
http://blog.csdn.net/wuzoujing/article/details/4943251

请问通过这些函数拟合之后,如何获得拟合后的曲线方程?

这些插值方法最后一般得到的是分段的多项式函数,有pp或b两种保存形式。
举个例子
clear;clc;
x=1:4;
y=sin(x);
p=spline(x,y)

运行后可以看到结构体p如下
p =

form: 'pp'
breaks: [1 2 3 4]
coefs: [3x4 double]
pieces: 3
order: 4
dim: 1

它是一个3段多项式分段函数(pp),断点为[1 2 3 4](即1~2、2~3、3~4三段),每个分段函数为一个多项式,多项式的系数保存在coefs里,每一行代表一个分段函数。
输入p.coefs

ans =

0.1177 -0.7711 0.7212 0.8415
0.1177 -0.4180 -0.4679 0.9093
0.1177 -0.0649 -0.9508 0.1411
就可以知道多项式的表达式了,比如第二行表示函数:0.1177*(x-2)^3-0.4180*(x-2)^2 -0.4679*(x-2)+0.9093(这个2就是断点)
这个分段函数的定义域为2~3,如果你要算2.5的插值,只要把他代入这个函数,就得到了这个多项式即可,当然用matlab只要输入命令ppval(p,2.5)就可以了追问

那么第一行就表示 0.1177*(x-1)^3 - 0.7711*(x-1)^2 +0.7212*(x-1) + 0.8415
第三行是 0.1177(x-3)^3 -0.00649(x-3)^2 -0.9508*(x-3) +0.1411

是这样吗
就是说第n行的区间如果是m ~ m+1 , 那么这一行的多项式就是关于 (x-m)的?

追答

是的

追问

另外 我看样条工具箱的函数 sp = spmak(knots,ctrlpoints)(就是我的问题里那个链接),好像返回值sp结构体中不包含方程,您能否帮我看看?

非常感谢!!!

追答

还是这个例子
clear;clc;
x=1:4;
y=sin(x);
b=spapi(3,x,y)
得到b如下
b =

form: 'B-'
knots: [1 1 1 2.5000 4 4 4]
coefs: [0.8415 1.2500 -0.0788 -0.7568]
number: 4
order: 3
dim: 1
说明这个插值表达式是由4个3阶b样条函数加权相加得到,权值为coefs,即
y=coefs[1]*B[1][3](x)+coefs[2]*B[2][3](x)+coefs[3]*B[3][3](x)+coefs[4]*B[4][3](x)
其中b样条函数B[j][k](x)通过如下递归关系得到:
B[j][k](x)=B[j][k-1](x)*(x-knots[j])/(knots[j+k-1]-knots[j])+B[j+1][k-1](x)*(knots[j+k]-x)/(knots[j+k]-knots[j+1])
其中初值B[j][0](x)是一个分段函数,满足当x∈(knots[j],knots[j+1]),B[j][0](x)=1,否则B[j][0](x)=0

实际计算插值时直接使用spval函数即可。

追问

首先 非常感谢您耐心的解答

但我给的例子是:

先给定一些点,用spmak函数进行b样条拟合,最后得出结果是:



这样的情况如何获得方程呢??

追答

一样的,只不过你插值了x和y两个,所以coefs是两行,也就是第一行表示x的b样条插值函数,第二行表示y的b样条插值函数。
按照你的智力水平我觉得应该没必要一一赘述吧,相信你会举一反三,否则什么都说要累死的。
还有,matlab的帮助很详细的,相信以你的智商90%以上问题都能通过帮助解决,没必要都求助。

追问

谢谢你鄙视我的智力,但是我觉得得出的coefs就是我前面输入的ctrlpoints,knots也是我原来输入的

追答

你本来就是用spmak来直接定义的啊,你又不是用spapi之类的插值函数来插值的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-07

网页链接查看网址中*pp - 分段多项式*部分

通过

pp=spline(x,y)

得到结构体,然后调用

pp.coefs

查看每个分段下的多项式的系数

注意

 - 对于区间 [x1,x2] 上的系数 [a,b,c,d],对应的多项式为

f(x)=a(x−x1)^3+b(x−x1)^2+c(x−x1)+d .