找回密码
 注册
关于网站域名变更的通知
查看: 456|回复: 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的范围。

    最后要输出表达式的话这个还是有点复杂的:使用以下函数。! G$ E9 r# |7 V
       pp=interp1(ax,ay,'spline','pp');
) M  [& L9 A$ H, W1 Y4 R: D8 ?$ F& l       breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
" I8 }* {6 {% S0 N, h       coefs=pp.coefs; %假设coefs的第i行为a b c d,1 W$ {" r1 i; h& Z6 A& N
    接着再用一个循环得出每个表达式输出各个表达式即可。

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

   % use natural cubic spline to interpolate data point
" |* @& x4 G* F8 a4 }6 \   % a、(0,3),(1,5),(2,4),(3,1)
4 F, b& y2 v' c  Z' J3 k   % b、(-1,3),(0,5),(3,1),(4,1),(5,1)$ ]& o8 ~: Y( ?8 D% }
function page_178_1_natural_spline_script% F5 N$ u( q& `) @2 Z
ax = [0 1 2 3];
9 M6 a0 \/ g) z4 a3 R7 `. Way = [3 5 4 1];  %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像
; X! M# G* P  e2 j) nbx = [-1 0 3 4 5];, Z- R) M2 h( I& H7 d$ y1 _
by = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
! I7 m1 a1 ?' r# Q+ qcsa = spline(ax,[0 ay 0]);% I* _, T: y, C$ N( Z6 V
xxa = linspace(0,3,1000);" P% p8 X3 n/ d4 U8 @
subplot(1,2,1);0 _9 r- {0 g- b9 O
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');
2 @; w2 P5 n1 F2 M7 s! M: B; \$ g# fxlabel('a x 0~3');
/ ]2 U& Q9 M' ]- H8 jylabel('a y');
# i' f" h" C# M1 w6 mtitle('equation a');1 v. s5 i1 N5 f6 _: ?
csb = spline(bx,[0 by 0]);
; q1 v1 [6 }: L0 A! ~/ Cxxb = linspace(-1,5,10000);
* t; c3 ?1 h2 Q) |# hsubplot(1,2,2);
7 V/ F& k1 w1 j" uplot(bx,by,'o',xxb,ppval(csb,xxb),'-');
% I2 T; k2 q+ x" {: ]. Mxlabel('b x -1~5');
$ M5 m. Q9 o2 y$ Pylabel('b y');  D5 ]1 N5 y, Z/ V7 b5 h
title('equation b');

pp=interp1(ax,ay,'spline','pp');
3 H( [% l* H; k+ d* gbreaks=pp.breaks; %breaks的第i和i+1个元素为m和n
6 V% _+ s$ S6 Dcoefs=pp.coefs; %假设coefs的第i行为a b c d,2 ]: F# e  M/ t% Z; ^0 G' l  x# f
     %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
% p- X; |, r6 q; P$ f- U9 e     %a(x-m)^3+b(x-m)^2+c(x-m)+d
7 ]# v& j- L; E; U7 Bsyms x8 y9 R/ T5 Y8 l( r9 C
disp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');$ j% O. Y' b# r( K( P" e5 `
for i = 1:3( J1 p5 i" 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)
; `' @1 ?  E7 v3 W; d5 X1 Bend
. L2 S) r6 M( }* E. Oppb=interp1(bx,by,'spline','pp');/ \$ w( r  N. R6 @- M4 k* F  Z
breaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n
2 Z3 U7 }* I( s! }coefsb=ppb.coefs; %假设coefs的第i行为a b c d,
# {! ]# V* L) M. ]+ H  {%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
* P- e7 g4 q/ r# h8 b4 L# |% n%a(x-m)^3+b(x-m)^2+c(x-m)+d
; M3 W& h2 }; lsyms x5 u" T  E8 N) O- F
disp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');
. M. `1 U3 t* E, r  L- {9 Y: M# pfor i = 1:4( R# |1 k! K8 v& l, ~
   y = coefsb(i,1)*((x - breaksb(i))^3) + coefsb(i,2)*((x - breaksb(i))^2) + coefsb(i,3)*((x -

   breaksb(i))) + coefsb(i,4)) B( Z' r4 o1 S! d
end


: ^1 N$ |1 G! R3 v

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 21:07 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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