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

    最后要输出表达式的话这个还是有点复杂的:使用以下函数。
) R% `$ q+ d& P: o$ n       pp=interp1(ax,ay,'spline','pp');' t6 Z7 _1 M3 d
       breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
! q0 s  n1 P  U, h% U& S+ \       coefs=pp.coefs; %假设coefs的第i行为a b c d,
/ o* k5 m( y: c. b8 S8 y6 N( \    接着再用一个循环得出每个表达式输出各个表达式即可。

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

   % use natural cubic spline to interpolate data point
0 u2 O; W. [4 Q- x8 s   % a、(0,3),(1,5),(2,4),(3,1)2 f  z: I: {, L: d/ x- i
   % b、(-1,3),(0,5),(3,1),(4,1),(5,1)
5 k  @% Q2 Q% |function page_178_1_natural_spline_script- E1 r( O8 l, U1 j
ax = [0 1 2 3];& a! ]! Y  [( K5 V- r( _2 T4 W
ay = [3 5 4 1];  %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像
, C8 \# x/ L9 I* j% o; |; d# i3 obx = [-1 0 3 4 5];
6 Q' c7 I, o+ ~# [$ h) {+ d& ]by = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
7 u( ~7 U! q- J' j# l8 ?csa = spline(ax,[0 ay 0]);
% e( b; H* p) h7 ^xxa = linspace(0,3,1000);5 N0 U. D2 G7 W2 a! l  _, f
subplot(1,2,1);: p) h$ k3 t8 {/ ^
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');' G0 e8 p' n8 p& E3 s5 b  \4 R
xlabel('a x 0~3');7 p0 U, v9 p/ U# ]' f/ l
ylabel('a y');
& r, H+ e5 X* O) O0 R& T5 Ntitle('equation a');3 \) d1 G* x- a2 c" M
csb = spline(bx,[0 by 0]);( K8 E# F) Q* W# n, i& i
xxb = linspace(-1,5,10000);0 {3 j8 t( A6 _+ ]7 ?/ D
subplot(1,2,2);2 F4 V& D# A7 f' R! a' B0 t" M, @
plot(bx,by,'o',xxb,ppval(csb,xxb),'-');
7 ~4 b7 B9 X+ }( Z1 oxlabel('b x -1~5');
' q2 i4 }0 e6 i6 ^% c. m: v& Pylabel('b y');
, w# i6 s5 D  W% a/ s2 u1 htitle('equation b');

pp=interp1(ax,ay,'spline','pp');' i: W# c& A' h! H
breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
# s3 a, t+ D+ O+ V! y2 @coefs=pp.coefs; %假设coefs的第i行为a b c d,! i; [0 _& f! @0 s- a
     %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是" U  U8 n' l3 N) V
     %a(x-m)^3+b(x-m)^2+c(x-m)+d0 S, m$ f0 }, m* }0 ~3 e
syms x+ j$ K+ e+ S  B# J, ^! R( s
disp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');0 {; y2 k3 q6 a1 o4 a- g, O
for i = 1:3
$ J7 ]5 n3 j2 V3 j    y = coefs(i,1)*((x - breaks(i))^3) + coefs(i,2)*((x - breaks(i))^2) + coefs(i,3)*((x - breaks

    (i))) + coefs(i,4)
$ ^# w/ l! {9 Mend/ T$ B9 u4 [/ ^& [+ v/ U
ppb=interp1(bx,by,'spline','pp');1 s1 _' t( y5 `9 c$ `
breaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n0 r6 _/ ^4 Z5 n" z! k! n# x
coefsb=ppb.coefs; %假设coefs的第i行为a b c d,
5 H) R5 v3 _0 Q%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是6 e( Y/ s; C; r1 H
%a(x-m)^3+b(x-m)^2+c(x-m)+d" r+ B  G  b  p  V* J) g
syms x
2 t, U7 B- c4 s' H0 Rdisp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');
+ H9 @$ f/ Q9 \; X+ F! m8 |for i = 1:4
& f" u2 R: O3 q2 b' i  y% ~2 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)! M0 A, ]7 M# T; o
end

& J+ |3 S/ c$ ^0 |

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 05:16 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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