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

    最后要输出表达式的话这个还是有点复杂的:使用以下函数。
* [' `) q4 p1 c. q       pp=interp1(ax,ay,'spline','pp');) w' R* u, w& M/ r3 N! F
       breaks=pp.breaks; %breaks的第i和i+1个元素为m和n$ h, M+ k/ [% a1 q, D3 R; ~. Q
       coefs=pp.coefs; %假设coefs的第i行为a b c d,; b  F4 N" F8 q9 [) U7 ^
    接着再用一个循环得出每个表达式输出各个表达式即可。

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

   % use natural cubic spline to interpolate data point* P) j- m# P8 w- k
   % a、(0,3),(1,5),(2,4),(3,1)
/ j5 r- i5 A1 @( z) z+ Z. j   % b、(-1,3),(0,5),(3,1),(4,1),(5,1)" v5 i. ?5 w+ C) ?  T  a
function page_178_1_natural_spline_script
0 p8 q* `9 h3 O- d4 g/ ?  ^ax = [0 1 2 3];
& |5 A$ w, N# p# D: A9 bay = [3 5 4 1];  %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像
$ F0 M& `7 v7 H, I) r$ _bx = [-1 0 3 4 5];7 u, S/ R+ i: d& J" H
by = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像
+ X) F4 M1 T- F( \2 n; ~csa = spline(ax,[0 ay 0]);
2 i) c. A# p4 Z. q- t5 u* Dxxa = linspace(0,3,1000);" ]( z7 c: |3 Q* n7 F
subplot(1,2,1);
  V% ?/ J2 k# D+ w5 ~2 H6 pplot(ax,ay,'o',xxa,ppval(csa,xxa),'-');
* E% i2 O& T( `" \$ X$ [' xxlabel('a x 0~3');
8 H" s" }( m% S& r' l0 f# l1 wylabel('a y');& Y) o& E: B$ a2 v4 d+ c
title('equation a');
0 e. ]% s1 o9 e7 [( ?csb = spline(bx,[0 by 0]);
4 n8 D- t* Z. A# \xxb = linspace(-1,5,10000);
7 N* z0 I& h0 z8 Y. z2 `+ usubplot(1,2,2);' D  _3 h+ m1 }8 D! U" K# [2 u. v
plot(bx,by,'o',xxb,ppval(csb,xxb),'-');
" ^/ @# h% s1 U+ K4 D1 f4 Oxlabel('b x -1~5');
& g% ^+ [7 l) L) eylabel('b y');+ P0 W  q, x! y8 O8 W9 `
title('equation b');

pp=interp1(ax,ay,'spline','pp');
; Q/ ~8 z+ b9 S$ K7 ibreaks=pp.breaks; %breaks的第i和i+1个元素为m和n0 \4 t+ U! s9 i4 @
coefs=pp.coefs; %假设coefs的第i行为a b c d,/ N/ a4 N1 t, h1 t9 ]
     %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是% v, v1 ]* Q4 i3 r0 L
     %a(x-m)^3+b(x-m)^2+c(x-m)+d" T$ W' h" E' A  n4 C7 {) q
syms x
. _; t( |/ m2 I  sdisp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');6 e$ ?  ~* @0 Y7 L6 E9 v9 E" c. T7 e
for i = 1:39 Q3 C! R9 }) a6 W7 f! H
    y = coefs(i,1)*((x - breaks(i))^3) + coefs(i,2)*((x - breaks(i))^2) + coefs(i,3)*((x - breaks

    (i))) + coefs(i,4)
2 v7 y- L/ d0 z2 D$ oend
; }, U9 u2 y7 Z! t! Ippb=interp1(bx,by,'spline','pp');% R( D, G0 P0 w* d. X
breaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n, x+ i; O- {  C. M  s0 d0 s) z( A
coefsb=ppb.coefs; %假设coefs的第i行为a b c d,
5 E8 i% T5 F% U/ V1 ?- E* ?%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
  O+ d3 k0 x6 r: d* m8 t%a(x-m)^3+b(x-m)^2+c(x-m)+d
. G/ I; {* `8 X. P4 r. hsyms x* W" l" j& `$ Z, a
disp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');' Y4 \' H. G% L/ u6 c
for i = 1:4, v$ u8 m% D" I" u$ A
   y = coefsb(i,1)*((x - breaksb(i))^3) + coefsb(i,2)*((x - breaksb(i))^2) + coefsb(i,3)*((x -

   breaksb(i))) + coefsb(i,4)# k0 Y1 c- k5 O) p2 v0 z5 b
end

6 v. h+ r' Q3 i/ `! W5 o& c

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 13:35 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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