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的范围。 最后要输出表达式的话这个还是有点复杂的:使用以下函数。
& m* y/ O7 ?( E pp=interp1(ax,ay,'spline','pp');/ g8 `* r1 O+ P' M7 y
breaks=pp.breaks; %breaks的第i和i+1个元素为m和n; S# \# h4 \' l! C8 I. C M; L* g
coefs=pp.coefs; %假设coefs的第i行为a b c d,
6 @( s9 u& G- V/ J 接着再用一个循环得出每个表达式输出各个表达式即可。 一下是我的代码,写的有一点粗糙,希望别见怪啊! % use natural cubic spline to interpolate data point
! |" ~* ~" }# @+ s % a、(0,3),(1,5),(2,4),(3,1)
* s& `' I1 v, u2 g6 { % b、(-1,3),(0,5),(3,1),(4,1),(5,1). ]8 f: [. d. T1 a$ ]
function page_178_1_natural_spline_script0 `) v! ]$ O+ W7 R; b
ax = [0 1 2 3];
6 o& R ^) x% h! b: `ay = [3 5 4 1]; %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像
8 M" }3 _0 Y- S; vbx = [-1 0 3 4 5];0 a G B$ o4 X
by = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
2 A1 p" k. K' H0 d/ x. o& _csa = spline(ax,[0 ay 0]);
9 s% u' f% w U- Q' yxxa = linspace(0,3,1000);6 |6 V# z6 v8 ?9 a0 f
subplot(1,2,1);# V' g; T" B2 g2 n0 r
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');4 Z$ W- F! p- ^
xlabel('a x 0~3');2 e1 o. p. _' l2 a
ylabel('a y');. `5 d7 Q% a/ p2 f4 }8 i
title('equation a');
) w5 n' i, |7 u1 j4 v! Ucsb = spline(bx,[0 by 0]);; X# R% K1 W+ R8 s
xxb = linspace(-1,5,10000);
% I2 b3 H' q* F. Qsubplot(1,2,2);
# U0 @1 g- y ~: i, F+ u/ n" Hplot(bx,by,'o',xxb,ppval(csb,xxb),'-');. j, c' N& G! ?5 h
xlabel('b x -1~5');
2 @* F5 w& \: b0 @0 N- q5 [ylabel('b y');
( T! X( l c% m( |: S+ Ktitle('equation b'); pp=interp1(ax,ay,'spline','pp');' b) e: i% m6 W+ K1 A4 t
breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
6 ~& V1 ~5 C; O: \. N8 Gcoefs=pp.coefs; %假设coefs的第i行为a b c d,
8 `. c" H6 M' ~& c* G. ] %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是; t; q- E0 I3 t |7 k
%a(x-m)^3+b(x-m)^2+c(x-m)+d
4 ~: G1 m- A2 H1 Y3 |) K4 b. asyms x
8 ~5 C- F$ O+ Z4 E* C* gdisp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:'); n5 f" Y" Q! p. d% p, u2 N; L: S
for i = 1:3
6 ~$ u- V6 j T0 q( ] y = coefs(i,1)*((x - breaks(i))^3) + coefs(i,2)*((x - breaks(i))^2) + coefs(i,3)*((x - breaks (i))) + coefs(i,4)
4 }' g' [* n+ _. S2 ^" z, }end
0 l9 @" w: h9 {ppb=interp1(bx,by,'spline','pp');
+ S, e5 z3 f' L- |, }) B; Ebreaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n
Z, g, ^. H! ?coefsb=ppb.coefs; %假设coefs的第i行为a b c d,( l, U) s! m6 z' p4 |
%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是" X* ?5 Y+ [, m4 Q
%a(x-m)^3+b(x-m)^2+c(x-m)+d- d9 B+ n' ` Q& D+ [& e
syms x
0 P2 G3 J4 j. ?) |# G# Hdisp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');
- L: r" i6 n7 Ofor i = 1:4
: _% k4 [& f/ W6 Q% }' }8 y4 N9 Z y = coefsb(i,1)*((x - breaksb(i))^3) + coefsb(i,2)*((x - breaksb(i))^2) + coefsb(i,3)*((x - breaksb(i))) + coefsb(i,4)
* l# T& ^6 t) f6 Y% G* E$ Pend 4 [8 E3 o: H& ]- h1 i5 t4 D
|