iy=interp1(x,y,ix,'spline');
plot(x,y,'ro',ix,iy,'b-')
对走刀曲线,易知x=07时
iy07=interp1(x,y,07,'spline')
iy07 =
16550
保留位小数:y= 1655
给你个计算样条基函数的程序自己用plot画就行
function L=bsp(x,k,knot)
spint=[];
p=length(knot)-k;
q=length(x);
ma=diag(ones(1,p));
for j=1:q
for i=1:p
sp=spmak(knot,ma(i,:));
spint(j,i)=fnval(sp,x(j));
end
end
L=spint;
x 是要求值点向量(当然x可以是一个实数啊);k是B样条基的介数,knot是你自己选得节点向量,很灵活的
>> x=[520,280,1566,78,3962,31,0];
>> x1=[0,31,3962,78,1566,280,520];
>> y=[0,-30,-36,-35,-2844,-94,0];
>> y1=[0,94,2844,35,36,30,0];
>> x2=520:-104:0;
>> y2=spline(x,y,x2);
>> x3=0:104:520;
>> y3=spline(x1,y1,x3);
>> plot(x2,y2,'-',x3,y3,'-')
其实要加入更多的点的话,你只需要把自变量x的范围按要求变化下就好了。但是要注意的就是样条函数的自变量X要求是递增或是递减,所以分成两段来解。
这些插值方法最后一般得到的是分段的多项式函数,有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里,每一行代表一个分段函数。
输入pcoefs
ans =
01177 -07711 07212 08415
01177 -04180 -04679 09093
01177 -00649 -09508 01411
就可以知道多项式的表达式了,比如第二行表示函数:01177(x-2)^3-04180(x-2)^2 -04679(x-2)+09093(这个2就是断点)
这个分段函数的定义域为2~3,如果你要算25的插值,只要把他代入这个函数,就得到了这个多项式即可,当然用matlab只要输入命令ppval(p,25)就可以了
如下:
function
fit_tulun
%多项式拟合方式
x=linspace(0,4pi,6);
y_jingque=sin(x);
%决定稀疏样本点数据
p_poly=polyfit(x,y_jingque,5);
x_poly_fit=linspace(0,4pi,100);
y_poly_fit=polyval(p_poly,x_poly_fit);
%三次样条拟合方式
sp=csapi(x,y_jingque);
%求三次样条函数的导数
s_diff=fnder(sp,1);
plot(x_poly_fit,y_poly_fit,'ko',x_poly_fit,y_poly_fit,'b:')
%plot(x_poly_fit,y_poly_fit,'b:')
hold
on
fnplt(sp,'r')
fnplt(s_diff,'c')
x1=linspace(0,4pi,200);
plot(x1,sin(x1),'m','linewidth',18)
legend('多项式拟合样本点','多项式拟合曲线','三次样条拟合曲线','三次样条导数曲线','正弦曲线精确图形')
以上就是关于样条曲线插值全部的内容,包括:样条曲线插值、拜求助画样条基函数的matlab函数、求教:matlab样条插值内插的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)