matlab样条拟合插值后获得曲线方程
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/10 14:16:02
matlab样条拟合插值后获得曲线方程
matlab提供了一些三次样条插值函数spline
以及样条工具箱函数,如
http://blog.csdn.net/wuzoujing/article/details/4943251
请问通过这些函数拟合之后,如何获得拟合后的曲线方程?
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之类的插值函数来插值的。
举个例子
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之类的插值函数来插值的。