EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
这一题是得到数据点(0,3),(1,5),(2,4),(3,1)并得到它的三次样条表达式和画出三次样条后的图图形。 以及对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)并得到它的三次样条表达式和画出三次样条后的图图形。 用函数spline可以直接得到,都是如果是要求自然三次样条呢?那就可以在数组y的左右两侧添0。如: csa = spline(ax,[0 ay 0]);再用xxa = linspace(0,3,1000);plot(xxa,ppval(csa,xxa));进行绘图。linespace是将0~3分成1000份,然后ppval是求三次样条在不同的xxa上的值。MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method'),其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量, 'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 'method'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'cubic'立方插值.缺省时表示线性插值。注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。 最后要输出表达式的话这个还是有点复杂的:使用以下函数。
" P) D- m. ^# x- C4 t# x& L pp=interp1(ax,ay,'spline','pp');
% v1 \1 ~# b. a {: M+ t) t breaks=pp.breaks; %breaks的第i和i+1个元素为m和n* g; w( Z2 z- y
coefs=pp.coefs; %假设coefs的第i行为a b c d,
5 T! v6 `( r% H ]4 t& O 接着再用一个循环得出每个表达式输出各个表达式即可。 一下是我的代码,写的有一点粗糙,希望别见怪啊! % use natural cubic spline to interpolate data point' A- C% |0 x% x5 W3 `9 h
% a、(0,3),(1,5),(2,4),(3,1)
" G0 E% Y1 R( s# `' i G % b、(-1,3),(0,5),(3,1),(4,1),(5,1). W% I2 a6 R2 Z3 u
function page_178_1_natural_spline_script
, W' m8 P% l8 ^' {! T! dax = [0 1 2 3];
7 J) O4 a. P( k4 u( J9 ~1 u& Z0 iay = [3 5 4 1]; %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像' ^4 h3 S7 U. R! T* d6 O5 i4 J
bx = [-1 0 3 4 5];- K% V( ?) o# S& m: t9 ?
by = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
- u* D, u$ V9 b7 ~: V) \! [* gcsa = spline(ax,[0 ay 0]);, X) h' t$ t0 p ]+ ?, f
xxa = linspace(0,3,1000);
$ p7 O3 l( o) n0 _$ g) `6 l. Esubplot(1,2,1);- m# Q( B) p b+ m
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');( d, C( ]& ^+ f4 B
xlabel('a x 0~3');8 F+ |+ I _( E O# v
ylabel('a y');
3 C& z) @6 X8 e {8 Ntitle('equation a');( m }1 W# d( ~2 I& d/ l( p7 y2 t
csb = spline(bx,[0 by 0]);
1 h& W0 A4 R( b5 p# nxxb = linspace(-1,5,10000);+ n$ Q7 l0 D8 Q, `. A" d. x4 ` O# A/ K
subplot(1,2,2);* J' F( A4 [9 n$ n9 W
plot(bx,by,'o',xxb,ppval(csb,xxb),'-');2 n! ^2 J3 t9 G7 J
xlabel('b x -1~5');) R. n1 x! r& M( G$ D) E- p
ylabel('b y');
/ p F( V9 I1 vtitle('equation b'); pp=interp1(ax,ay,'spline','pp');: \$ a; J' ]( q( S3 g' ^
breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
" T% L7 ?& N/ _coefs=pp.coefs; %假设coefs的第i行为a b c d,8 F$ ]( ~' u7 X$ f7 ]4 R, Q
%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是) i7 n9 t: P* V! `4 {! [2 @1 F. b/ L
%a(x-m)^3+b(x-m)^2+c(x-m)+d
) K5 N* D8 b* `7 C; y$ L, @7 E7 G4 J6 Msyms x+ ~ H \4 D/ N t: c* _; J2 k9 q& ?
disp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');, @( I- {$ D! ]1 ]
for i = 1:37 J1 f3 y/ v% k3 N
y = coefs(i,1)*((x - breaks(i))^3) + coefs(i,2)*((x - breaks(i))^2) + coefs(i,3)*((x - breaks (i))) + coefs(i,4)& ?5 B( R* P* x1 J# d
end+ d7 p7 s) P$ s) p4 D7 I( A% M
ppb=interp1(bx,by,'spline','pp');
: `3 X: I( O7 X6 e- c$ Dbreaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n
0 A- t- b/ U C2 |) z9 Bcoefsb=ppb.coefs; %假设coefs的第i行为a b c d,$ U+ [- J9 w: j4 N% R: [0 E# i
%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
V7 k* F) N. R1 O# \%a(x-m)^3+b(x-m)^2+c(x-m)+d; P. p* L7 Q+ r2 o9 y- b* O* j0 c: a
syms x* H0 n. B# |, x: H* N
disp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');: F# x7 u& D$ A9 d/ y/ t5 m5 b
for i = 1:43 m" N/ d! w/ Z& b2 K
y = coefsb(i,1)*((x - breaksb(i))^3) + coefsb(i,2)*((x - breaksb(i))^2) + coefsb(i,3)*((x - breaksb(i))) + coefsb(i,4)
3 A8 v: H. n) Z5 I- z6 e \end
|% C; I, A7 m6 s5 W/ f4 m4 w2 p |