一. B样条函数

B样条函数的MATLAB代码如下:

S=spapi(k,x,y)
%k为用户选定的B样条阶次,一般以4和5居多

例题1

分别用B样条函数对y和f(x)中的自选数据进行5次B样条函数拟合,并与三次分段多项式样条函数拟合的结果相比较。

解:

MATLAB代码如下:

clc;clear;%%y函数部分
x0=[0,0.4,1,2,pi];
y0=sin(x0);
ezplot('sin(t)',[0,pi]);
hold on%三次分段多项式样条插值
sp1=csapi(x0,y0);
fnplt(sp1,'--');%5次B样条插值
sp2=spapi(5,x0,y0);
fnplt(sp2,':')%%f(x)函数部分
x=0:.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);
figure;
ezplot('(x.^2-3*x+5).*exp(-5*x).*sin(x)',[0,1]),
hold on
sp1=csapi(x,y);
fnplt(sp1,'--');
sp2=spapi(5,x,y);
fnplt(sp2,':')

运行结果:

二. 基于样条插值的数值微分

在MATLAB中,可以利用以下函数来求S的k阶导数:

Sd=fnder(S,k)

如果是求多变量函数的偏导数,则格式如下:

Sd=fnder(S,[k1,...,kn])

例题2

任取函数f(x)的一些数据点,分别用三次分段多项式样条函数与B样条插值函数进行拟合,求出该函数的导数,并与理论推导结果进行比较。

解:

MATLAB代码如下:

clc;clear;syms x;
f=(x^2-3*x+5)*exp(-5*x)*sin(x);
ezplot(diff(f),[0,1]) %理论结果
hold on,
x=0:.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);
sp1=csapi(x,y); %建立三次样条函数
dsp1=fnder(sp1,1);
fnplt(dsp1,'--'); %绘制样条图
hold on,sp2=spapi(5,x,y); %5阶次B样条插值
dsp2=fnder(sp2,1);
fnplt(dsp2,':');
axis([0,1,-0.8,5])

运行结果:

例题3

自行选择z=f(x,y)中的数据,来拟合的曲面,并与解析解法绘制出的曲面相比较。

解:

MATLAB代码如下:

clc;clear;%拟合曲面
x0=-3:.3:3;
y0=-2:.2:2;
[x,y]=ndgrid(x0,y0);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
sp=spapi({5,5},{x0,y0},z); %B样条
dspxy=fnder(sp,[1,1]);
fnplt(dspxy) %生成样条图%理论方法
syms X Y;
Z=(X^2-2*X)*exp(-X^2-Y^2-X*Y);
figure;
ezsurf(diff(diff(Z,X),Y),[-3 3],[-2 2])
%对符号变量表达式做三维表面图

运行结果:

三. 基于样条插值的数值积分

S作为样条函数,对其进行数值积分格式如下:

f=fnint(S)

例题4

考虑以下积分中较稀疏的样本点,用样条积分的方式求出定积分及积分函数。

解:

MATLAB函数如下:


clc;clear;x=[0,0.4,1,2,pi];
y=sin(x);%建立三次样条函数并积分
sp1=csapi(x,y);
a=fnint(sp1,1);
xx1=fnval(a,[0,pi]);
integral1=xx1(2)-xx1(1)%建立B样条函数并积分
sp2=spapi(5,x,y);
b=fnint(sp2,1);
xx2=fnval(b,[0,pi]);
integral2=xx2(2)-xx2(1)%绘制曲线
ezplot('-cos(t)+2',[0,pi]); %不定积分可以上下平移
hold on,
fnplt(a,'--');
fnplt(b,':');

运行结果:

四.分段多项式

根据间断数和系数生成分段多项式pp,每个系数的值都是长度为d的向量。MATLAB格式如下:

pp=mkpp(breaks,coefs,d)

可以使用ppval来计算特定点处的分段多项式,也可以使用unmkpp来提取有关分段多项式的详细信息。

例题5

创建任意一个分段多项式,使得它在区间[0,4]内具有三次多项式,在区间[4,10]内具有二次多项式,在区间[10,15]内具有四次多项式。

解:

MATLAB代码如下:

clc;clear;breaks=[0 4 10 15];
coefs=[0 1 -1 1 1;0 0 1 -2 53;-1 6 1 4 77]; %一共有三段
pp=mkpp(breaks,coefs)%画图
xq=0:0.01:15;
plot(xq,ppval(pp,xq))
line([4 4],ylim,'LineStyle','--','Color','k')
line([10 10],ylim,'LineStyle','--','Color','k')

运行结果:

例题6

创建一个具有四个区间的单个分段多项式,这些区间在两个二次多项式之间交替。

解:

MATLAB代码如下:

clc;clear;%显示一个二次多项式在[-8,-4]区间上的结果
subplot(2,2,1)
cc=[-1/4 1 0];
pp1=mkpp([-8 -4],cc);
xx1=-8:0.1:-4;
plot(xx1,ppval(pp1,xx1),'k-')%在[-4,0]区间上的求反
subplot(2,2,2)
pp2=mkpp([-4 0],-cc);
xx2=-4:0.1:0;
plot(xx2,ppval(pp2,xx2),'k-')%将二次多项式扩展到四个区间形成的分段多项式
%显示一阶导数,该导数利用unmkpp分解分段多项式构造而成
subplot(2,1,2)
pp=mkpp([-8 -4 0 4 8],[cc;-cc;cc;-cc]);
xx=-8:0.1:8;
plot(xx,ppval(pp,xx),'k-')
[breaks,coefs,k,d]=unmkpp(pp);
dpp=mkpp(breaks,repmat(k-1:-1:1,d*1,1).*coefs(:,1:k-1),d);

运行结果:

基于MATLAB的B样条插值拟合算法与分段多项式(附完整代码)相关推荐

  1. 基于MATLAB的逆矩阵、相似矩阵、正交矩阵(附完整代码)

    一. 符号多项式与数值多项式的转换 向量,可以利用MATLAB将此向量转换为多项式表示,格式如下: f=poly2sym(P) 当然,反过来也可以将符号多项式转换为向量,格式如下: P=sym2pol ...

  2. 基于MATLAB的数论运算与编写函数(附完整代码)

    目录 一. 基本数论运算 例题1 例题2 例题3 例题4 二. 循环结构 2.1 for 结构 2.2 while结构 例题5 例题6 例题7 三. 转移结构 例题8 四. 开关结构与试探结构 4.1 ...

  3. 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)

    字符串匹配 字符串抽象数据类型 字符串模式匹配 简单的字符串匹配 Knuth-Morris-Pratt算法 背景分析 失配函数 定义 实现方法 函数分析 KMP函数 实现方法 函数分析 失配信息的另一 ...

  4. OpenCV均值漂移meanshift algorithm算法的实例(附完整代码)

    OpenCV均值漂移meanshift algorithm算法的实例 OpenCV均值漂移meanshift algorithm算法的实例 OpenCV均值漂移meanshift algorithm算 ...

  5. OpenCV camshift算法的实例(附完整代码)

    OpenCV camshift算法的实例 OpenCV camshift算法的实例 OpenCV camshift算法的实例 #include <iostream> #include &l ...

  6. OpenCV密集光流算法的实例(附完整代码)

    OpenCV密集光流算法的实例 OpenCV密集光流算法的实例 OpenCV密集光流算法的实例 #include <iostream> #include <iomanip> # ...

  7. OpenCV watershed分水岭分割算法的实例(附完整代码)

    OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 #include <opencv ...

  8. OpenCV支持向量机SVM和SDG算法的实例(附完整代码)

    OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 #include "opencv2/core. ...

  9. 程序员如何“炼”成算法大师? | 附完整代码

    作者 | 菠了个菜 责编 | 郭芮 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序:内部排序是数据记录在内存中进行排序:而外部排序是因排序的数据很大, ...

最新文章

  1. Ryzen 4000 Vermeer CPU和Radeon RX Big Navi 图形卡
  2. .net core 上 K8S(三)Yaml文件运行.netcore程序
  3. 北航卓越计划 计算机科学,解读:北京航空航天大学2017卓越计划自主招生条件...
  4. 共享内存---shmget shmat shmdt
  5. docker非常详细的介绍
  6. 19【CTR15】会话兴趣⽹络
  7. python 拼音 四线格_Python 中拼音库 PyPinyin 的用法
  8. Android(java)学习笔记97:使用GridView以及重写BaseAdapter
  9. 论基于构件的软件开发
  10. mysql数据库的基本使用流程
  11. office 2010 word文档,插入复选框,方框打勾(打对号)的方法
  12. JavaC++题解与拓展——leetcode953.验证外星语【么的新知识】
  13. H5--drag拖拽事件
  14. Python3中sys.stdin用法
  15. 我的世界刷猪人塔java版_我的世界主世界僵尸猪人刷怪塔制作教程
  16. 微信公众号云服务器年服务费_微信公众号开发者接口费用高吗
  17. phobos 调试 javascript
  18. Synchronized同步锁是如何实现的
  19. ssm毕设项目康健医药公司进销存管理22jao(java+VUE+Mybatis+Maven+Mysql+sprnig)
  20. Linux服务情书,搞笑肉麻情书

热门文章

  1. 常见文件对应的MIMEType类型
  2. dws连接db2使用教程_DB2使用手册
  3. 达梦数据迁移工具入门操作
  4. Navicat SQL美化后简化
  5. 北京化工大学计算机专业就业,北京化工大学
  6. 清理吉日嘎拉走火入魔C#.NET通用权限管理系统组件表数据的脚本方法参考
  7. 服务器换IP地址导致微信第三方服务失效
  8. 跟着iMeta学做图|双侧柱状图展示具有正负相关性的类型数量
  9. 软件工程师如何销售自己的作品
  10. 项目同时使用git和svn