我有一组数据,我想在matlab中使用曲线拟合工具箱来绘制数据的样条图。我这样做了:
x =
Columns 1 through 10
0 1.2500 1.8800 2.5000 5.0000 6.2500 6.8800 7.1900 7.5000 10.0000
Columns 11 through 13
12.5000 15.0000 20.0000
y =
Columns 1 through 10
-85.9300 -78.8200 -56.9500 -34.5600 -33.5700 -39.6400 -41.9600 -49.2800 -66.6000 -66.6100
Columns 11 through 13
-59.1600 -48.7800 -41.5300
cftool
[breaks,coefs,l,k,d] = unmkpp(pp)
breaks =
Columns 1 through 10
0 1.2500 1.8800 2.5000 5.0000 6.2500 6.8800 7.1900 7.5000 10.0000
Columns 11 through 13
12.5000 15.0000 20.0000
coefs =
-4.8535 30.6309 -25.0170 -85.9300
-4.8535 12.4304 28.8095 -78.8200
-11.9651 3.2573 38.6927 -56.9500
3.0330 -18.9977 28.9337 -34.5600
-0.2294 3.7501 -9.1852 -33.5700
-11.6351 2.8899 -0.8852 -39.6400
-68.6157 -19.1004 -11.0978 -41.9600
130.6350 -82.9130 -42.7220 -49.2800
-6.3971 38.5776 -56.4659 -66.6000
1.6010 -9.4008 16.4760 -66.6100
-0.2967 2.6064 -0.5099 -59.1600
-0.2967 0.3814 6.9597 -48.7800
l =
12
k =
4
d =
1
如果我错了,请纠正我,命令[breaks,coefs,l,k,d] = unmkpp(pp)
是否能够帮助我从我获得的样条曲线图中获得分段方程式?如果是这样,我可以知道我如何理解命令,所以我可以利用我自己的优势以及coefs,k,d中值的重要性。谢谢!基本上我希望能够获得方程式/方程来描述通过曲线拟合工具箱获得的样条图。任何帮助将不胜感激!
答案 0 :(得分:3)
这试图解释如何分离和显示在Matlab中生成的样条线。
生成模拟数据
xx = [1:10];
yy = cos(xx);
使用三次样条拟合数据
pp = spline(xx,yy);
用分段多项式插值,在x
中的更精细网格上进行评估xxf = linspace(min(xx),max(xx),100);
yyf=ppval(pp,xxf);
首先检查pp
,其中包含有关分段多项式的所有信息:
pp =
form: 'pp'
breaks: [1 2 3 4 5 6 7 8 9 10]
coefs: [9x4 double]
pieces: 9
order: 4
dim: 1
功能
[breaks,coefs,l,k,d] = unmkpp(pp)
仅展开结构pp
的内容,以便:
d = pp.dim;
l = pp.pieces;
breaks = pp.breaks;
coefs = pp.coefs;
k = pp.order;
因此,如果unmkpp
是包含所有信息的结构(如上所述),则无需调用pp
,您只需要系数和中断。相反,你只需输入
breaks = pp.breaks;
coefs = pp.coefs;
并继续使用此信息,如下所示。
请注意,对于三次样条曲线,多项式的阶数为4,因为多项式的形式为
C(1)* X ^(K-1)+ C(2)* X ^(K-2)+ ... + C(K-1)* X + C(K)
,K = 4,因此每个多项式都有 4 系数C.最高阶项X ^ 3与样条 cubic 一致。
评估分段多项式:
(1)选择您要评估的作品
由breaks
(2)选择存储在coefs
中的该片段的正确系数。
因为这些是分段多项式,我们对它们进行评估
根据实际值,范围0-1然后拉伸和移位
x。我们使用范围0-1来使用标准函数polyval
来评估所选部分的多项式系数,以评估在感兴趣的范围内具有已知系数的多项式。
因此,我们找到与该片相对应的系数cf
并评估点xev
处的多项式:
xev = linspace(0,1,100);
cf = pp.coefs(1,:);
yyp=polyval(cf,xev);
我们为绘图保留了一些额外的信息:
br = pp.breaks(1:2); % find the breaks (beginning and end of stretch of interest)
xxp = linspace(br(1),br(2),100);
我们可以概括这个程序。因此对于第n件(比如说#6):
n = 6;
cf = pp.coefs(n,:);
yyp2=polyval(cf,xev);
br = pp.breaks(n:n+1);
xxp2 = linspace(br(1),br(2),100);
当然,您可以跳过上述内容,只需使用ppval
(函数专用来处理spline
函数系列),这将执行
对你来说也是一样,对第三件说:
br = pp.breaks(3:4); % limits of the piece
xxp3 = linspace(br(1),br(2),100);
yyp3=ppval(pp,xxp3);
最后我们plot
上面评估的所有多项式
plot(xx,yy,'.')
hold on
plot(xxf,ppval(pp,xxf),'k:')
plot(xxp,yyp,'g-','linewidth',2)
plot(xxp2,yyp2,'r-','linewidth',2) % <-- generated with polyval
plot(xxp3,yyp3,'c-','linewidth',2) % <-- generated with ppval
axis tight