找回密码
 注册
关于网站域名变更的通知
查看: 486|回复: 1
打印 上一主题 下一主题

Matlab之三次样条画图和表达式

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-8-13 15:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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的范围。

    最后要输出表达式的话这个还是有点复杂的:使用以下函数。
! Z8 ]6 O# [- K3 b$ S* B       pp=interp1(ax,ay,'spline','pp');
" ]4 D/ L+ V# i& o       breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
7 C  S9 h0 x0 y       coefs=pp.coefs; %假设coefs的第i行为a b c d,7 x4 i. o% n/ i
    接着再用一个循环得出每个表达式输出各个表达式即可。

    一下是我的代码,写的有一点粗糙,希望别见怪啊!

   % use natural cubic spline to interpolate data point4 M! e! Y  ~8 Q7 f
   % a、(0,3),(1,5),(2,4),(3,1)
% C; E5 X4 G) y! m5 `   % b、(-1,3),(0,5),(3,1),(4,1),(5,1)2 g( a% W- ~8 b7 H3 ^! u( K: G
function page_178_1_natural_spline_script
9 \3 ^  u. [: e. kax = [0 1 2 3];
; E* f) j/ i7 nay = [3 5 4 1];  %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像
! k2 D( O- R& U2 ~) S" a5 `bx = [-1 0 3 4 5];
! G  Y) Q- u+ gby = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
. M9 M1 A4 z- e2 x# W  H! gcsa = spline(ax,[0 ay 0]);5 g, S  U; w1 v1 n7 L
xxa = linspace(0,3,1000);# N$ V. V# Q% G6 z! l" p8 N
subplot(1,2,1);5 Q8 U: l% V% x, B- m# C6 o
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');' Z7 t$ j: H) P( m9 g
xlabel('a x 0~3');
- q' P6 D2 t! Y- sylabel('a y');
9 O# x  L2 b% Y) Ztitle('equation a');
1 U0 p5 a) j$ j/ K7 i: W7 u& rcsb = spline(bx,[0 by 0]);# G) n7 ~0 ^1 v7 s! U8 i
xxb = linspace(-1,5,10000);
; M* o9 _% t7 zsubplot(1,2,2);
: y9 \1 [4 A: zplot(bx,by,'o',xxb,ppval(csb,xxb),'-');
) r  z! g% b6 n# Txlabel('b x -1~5');
6 a% a7 ?1 v; V3 }/ Xylabel('b y');
# Q/ k1 n( K$ {! {title('equation b');

pp=interp1(ax,ay,'spline','pp');* ~$ {3 f4 H6 B9 Y4 U
breaks=pp.breaks; %breaks的第i和i+1个元素为m和n% H7 f- t/ t% V( w; [' b
coefs=pp.coefs; %假设coefs的第i行为a b c d,
+ K$ T8 a* ?* R5 d* C  s     %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
) q* ^" k" F% |4 d     %a(x-m)^3+b(x-m)^2+c(x-m)+d0 _; k. }7 s& W, k9 ]6 `! D
syms x- G& k3 T% x# m
disp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');
! }; A( e3 N0 Y; l. ~) `for i = 1:3
9 {; L; w' }. b( R  c    y = coefs(i,1)*((x - breaks(i))^3) + coefs(i,2)*((x - breaks(i))^2) + coefs(i,3)*((x - breaks

    (i))) + coefs(i,4)
9 @, E4 `: {! b. Y0 wend
/ @$ M& N. v3 y  E) @& xppb=interp1(bx,by,'spline','pp');% N9 w1 ^. p, h4 n6 J- ?4 ~
breaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n
% o" \+ C& f: R2 e% n; acoefsb=ppb.coefs; %假设coefs的第i行为a b c d,) x# z& s# g) G0 a; [
%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是* ], ~( K1 B9 H. Y) N; C5 W
%a(x-m)^3+b(x-m)^2+c(x-m)+d
) N9 v- U: ^! u: wsyms x
+ a. J0 f$ N" adisp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');  }  Y; R. @$ Y) O9 W( i
for i = 1:4$ d& b, y" L: t
   y = coefsb(i,1)*((x - breaksb(i))^3) + coefsb(i,2)*((x - breaksb(i))^2) + coefsb(i,3)*((x -

   breaksb(i))) + coefsb(i,4)8 S; M3 s3 Y4 M: n9 U
end

2 N! O0 P3 @0 t

该用户从未签到

2#
发表于 2020-8-13 17:00 | 只看该作者
学习                              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 22:14 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表