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

    最后要输出表达式的话这个还是有点复杂的:使用以下函数。7 ~! E$ [0 l3 W. e0 B" n
       pp=interp1(ax,ay,'spline','pp');
# ^- K3 G- Y% r5 d  [9 Y2 ?       breaks=pp.breaks; %breaks的第i和i+1个元素为m和n
! D$ _* h' D- x* I: ~7 o       coefs=pp.coefs; %假设coefs的第i行为a b c d,
- B: m0 }9 E* ?    接着再用一个循环得出每个表达式输出各个表达式即可。

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

   % use natural cubic spline to interpolate data point
- G! Y- P' v9 Q% q; G   % a、(0,3),(1,5),(2,4),(3,1)
+ M& Z" P) a% s8 U: I9 Y7 i   % b、(-1,3),(0,5),(3,1),(4,1),(5,1)$ {2 V" M7 @& ^  K; {) Y8 w4 F
function page_178_1_natural_spline_script
6 r  m) L$ z  z4 \0 e4 q) Cax = [0 1 2 3];) j& s# E3 @& p0 t
ay = [3 5 4 1];  %对数据点(0,3),(1,5),(2,4),(3,1)进行三次样条建模,并输出表达式和图像( e# ?5 G; @, [' G3 k- }, }! ?2 n
bx = [-1 0 3 4 5];
6 }  D9 S$ h5 O0 M- \) Jby = [3 5 1 1 1];%对数据点(-1,3),(0,5),(3,1),(4,1),(5,1)进行三次样条建模,并输出表达式和图像" ^/ L! D/ G& P3 M
csa = spline(ax,[0 ay 0]);
5 d- d1 j& O& M+ f  f# Nxxa = linspace(0,3,1000);
0 h4 C  r# f; ?* Fsubplot(1,2,1);: ^1 y4 U( F0 {) S1 Z5 N  ~
plot(ax,ay,'o',xxa,ppval(csa,xxa),'-');
8 ^0 O! Z$ r3 n  ?1 \& f3 j4 {2 O% d- Txlabel('a x 0~3');
1 x' V# w+ j, u% r- ^! Nylabel('a y');
) `8 v# t/ `( qtitle('equation a');
' q) G, v, b& C8 Y' m. gcsb = spline(bx,[0 by 0]);
% b; Z# u0 U. E: S3 w# [xxb = linspace(-1,5,10000);) A9 y% f2 m9 t" o2 {7 U. d
subplot(1,2,2);
: r6 C. a/ f4 Z, qplot(bx,by,'o',xxb,ppval(csb,xxb),'-');
! z7 S* y4 A( q* |1 u% c6 `$ l# }4 Q2 jxlabel('b x -1~5');
. W% h( z3 w' t+ a% N% ~" Vylabel('b y');9 l$ M9 t0 z: R8 h6 M
title('equation b');

pp=interp1(ax,ay,'spline','pp');
: _; Z4 A& N- V: Zbreaks=pp.breaks; %breaks的第i和i+1个元素为m和n. z" z% |" c, B' E( C4 N+ ^1 K
coefs=pp.coefs; %假设coefs的第i行为a b c d,
$ r8 a+ H( H% p* ?     %breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
2 l% G8 R8 J9 W' Z. P     %a(x-m)^3+b(x-m)^2+c(x-m)+d
; m/ a5 [, b$ g& |4 s# hsyms x' e$ Z/ {7 B5 @, T
disp('对于数据点(0,3),(1,5),(2,4),(3,1)的三次样条表达式为:');
, R" ?# `# B  M% w1 M. J, O# sfor i = 1:38 S5 l' u' _1 r$ C1 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)
3 Z/ y% R7 w1 _. x9 H, \2 n2 kend. T$ x0 X, G- j( a  I  O! N
ppb=interp1(bx,by,'spline','pp');( e* U# h" Q$ G8 J8 d
breaksb=ppb.breaks; %breaks的第i和i+1个元素为m和n- w: H3 D/ p* }/ Z3 U' y
coefsb=ppb.coefs; %假设coefs的第i行为a b c d,' F# ^. Y. D5 F0 v! ~! u
%breaks的第i和i+1个元素为m和n那么在区间[m,n]的函数表达式就是
3 A# i, k: O! d6 X& M, M%a(x-m)^3+b(x-m)^2+c(x-m)+d3 c( Q& [, m/ i
syms x6 h% @/ S1 k/ ~, R6 Y  z4 E
disp('对于数据点(-1,3),(0,5),(3,1),(4,1),(5,1)的三次样条表达式为:');
% r$ m& j/ ~' b3 zfor i = 1:4  E: Z& f8 m4 Z$ A5 y' d: x' 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)
7 Z9 ^. y: C$ Y7 M6 Q' b3 Cend


# U& t9 B4 n/ `1 O, ^

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 00:10 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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