参照《数值分析 第五版(李庆扬)》P42 2.6.2样条插值函数的建立
目的是可以通过读取文本文件中提前存储的坐标点,来实现三边界种类型的三次样条插值

F.m

function result = F(newton, a, b)%1阶差商求值result = (newton(b, 2) - newton(a, 2)) / (newton(b, 1) - newton(a, 1));
end

S.m

function s = S(h, M1, M2, x1, x2, y1, y2, x)%M1, M2 = Mj, Mj+1; X1, X2 = Xj, Xj+1; H = Hj: Y1, Y2 = Yj, Yj+1; s = M1 * (x2 - x).^3 ./ (6 * h) + M2 * (x - x1).^3 ./ (6 * h) + (y1 - M1 * h^2 / 6) .* (x2 - x) ./ h...+ (y2 - M2 * h^2 / 6) .* (x - x1) ./h;s = s .* (heaviside(x - x1) - heaviside(x - x2));
end

spline.m这个是主函数

% 读取文本文件中存储的横纵坐标,txt的格式为:
% x1    y1
% x2    y2
% ...
% xn    yn
% xn+1  yn+1
%横纵坐标用Tab隔开
FileData = load('data.txt');
X = FileData(:,1);
Y = FileData(:,2);
NewTon = [X, Y];
PointNumber = length(X); %n + 1 个点
n = PointNumber-1;
X_min = min(X);
X_max = max(X);
Y_min = min(Y);
Y_max = max(Y);
kind = input("请输入边界条件类型:1(已知两端的一阶导数值),2(已知两端二阶导数值)或3(f(x)是以Xn-X0为周期的周期函数))\n");
if(kind ==3 && abs(Y(1) - Y(n+1)) >= 1e-5)disp("两端函数值不一致,错误!");return;
end
h = [0];
u = [0];
Lamda = [0];
d = [0];%求hi
for i = 0:n - 1h(i+1) = X(i+2) - X(i+1);%h参数加了1
end
%求ui 和 Lamdai
for j = 1:n - 1u(j) = h(j) / (h(j) + h(j+1));%h参数加了1 Lamda(j) = h(j+1) / (h(j) + h(j+1));%h参数加了1
end
%求di
for j = 1:n - 1d(j) = 6 * (F(NewTon, j+1, j+2) - F(NewTon, j, j+1)) / (h(j) + h(j+1));%h参数加了1
end%%%%%%%%%% 第一、二种情况
if(kind == 1 || kind == 2)if(kind == 1)f0D1 = input("请输入f(x0)一阶导数值\n");%3;%f(x0)一阶导数fnD1 = input("请输入f(xn)一阶导数值\n");%-4;%f(xn)一阶导数Lamda0 = 1;d0 = (6 / h(0+1)) * (F(NewTon, 0+1, 1+1) - f0D1);un = 1;dn = (6 / h(n-1+1)) * (fnD1 - F(NewTon, n-1+1, n+1));else%第二种情况f0D2 = input("请输入f(x0)二阶导数值\n");%3;%f(x0)一阶导数fnD2 = input("请输入f(xn)二阶导数值\n");%-4;%f(xn)一阶导数Lamda0 = 0;d0 = 2 * f0D2;un = 0;dn = 2 * fnD2;end%生成系数矩阵AA = 2 .* eye(n+1, n+1);%生成元素是2的对角阵for j = 2 : nA(j, j+1) = Lamda(j-1);endfor j = 1:n - 1A(j+1, j) = u(j);endA(1, 2) = Lamda0;A(n+1, n) = un;%生成常数列向量bb = [d0, d, dn]';%求解矩阵方程M=A \ b;x = X_min - 10 : 0.001 : X_max + 10;%画出坐标点plot(X,Y,'x');hold on;Sx = 0;%构建插值多项式for j = 1:nSx = Sx + S(h(j), M(j), M(j+1), X(j), X(j+1), Y(j), Y(j+1), x);%function s = S(h, M1, M2, x1, x2, y1, y2, x);endplot(x,Sx);title(['三次样条插值 边界条件类型:',num2str(kind)]);axis([X_min-0.1*(X_max-X_min) X_max+0.1*(X_max-X_min) Y_min-0.1*(X_max-X_min) Y_max+0.1*(X_max-X_min)]);grid on;legend("坐标点","插值函数");
end
%%%%%%%%%% 第三种情况
if(kind == 3)Lamdan = h(1) / (h(n) + h(1));un = 1 - Lamdan;dn = 6 * (F(NewTon, 1, 2) - F(NewTon, n, n+1)) / (h(1) + h(n));%生成系数矩阵AA = 2 .* eye(n, n);%生成元素是2的对角阵for j = 1:n-1A(j, j+1) = Lamda(j);endfor j = 1:n-2A(j+1, j) = u(j+1);endA(1, n) = u(1);A(n, 1) = Lamdan;A(n, n-1) = un;%生成常数列向量bb = [d, dn]';%求解矩阵方程M = A \ b;M = [M(1), M']';x = X_min - 10 : 0.001 : X_max + 10;%画出坐标点plot(X,Y,'x');hold on;Sx = 0;%构建插值多项式for j = 1:nSx = Sx + S(h(j), M(j), M(j+1), X(j), X(j+1), Y(j), Y(j+1), x);%function s = S(h, M1, M2, x1, x2, y1, y2, x);endplot(x,Sx);title(['三次样条插值 边界条件类型:',num2str(kind)]);axis([X_min-0.1*(X_max-X_min) X_max+0.1*(X_max-X_min) Y_min-0.1*(X_max-X_min) Y_max+0.1*(X_max-X_min)]);grid on;legend("坐标点","插值函数");
end

第三种边界类型测试:

运行结果:


第二种边界类型测试:


MATLAB代码实现三次样条插值相关推荐

  1. 基于MATLAB的三维数据插值拟合与三次样条拟合算法(附完整代码)

    目录 一. 三维插值 例题1 二. 高维度插值拟合 格式一 格式二 格式三 格式四 格式五 例题2 三. 单变量三次样条插值 例题3 例题4 四. 多变量三次样条插值 例题6 一. 三维插值 首先三维 ...

  2. 【matlab】三次埃尔米特插值与三次样条插值的实际应用代码

    要求:完成下列这些数据的插值,并将结果保存到一个EXCEL表格中.要求至少选取两种插值方法,并对1号池中的这些指标做出插值后图像(显示在同一个图像中) Z.mat load Z.mat x=Z(1,: ...

  3. 数学建模之Hermite插值法和三次样条插值法(附上详细的matlab代码)

    插值算法 一般定义 若P(x)为次数不超过n的代数多项式,即 P(x)=a0+a1x+...+anxnP(x)=a_0+a_1x+...+a_nx^n P(x)=a0​+a1​x+...+an​xn ...

  4. 数学建模 | MATLAB学习 | 插值 一维插值函数、三次样条插值

    1.一维插值函数 Matlab中有现成的一维插值函数interp1,语法为  y=interp1(x0,y0,x,'method') x0,y0是已知的数据向量,其中x应以升序或者降序排列(所有的插值 ...

  5. Matlab数值分析实例:三次样条插值

    Matlab数值分析实例:三次样条插值 任务要求 分析 代码实现 总结 任务要求 湖水在夏天会出现分层现象,接近湖面温度较高,越往下温度变低.这种上热下冷的现象影响了水的对流和混合过程,使得下层水域缺 ...

  6. 基于神经网络多项式插值的图像超分辨重构研究-附Matlab代码

    ⭕⭕ 目 录 ⭕⭕ ✳️ 一.引言 ✳️ 二.基于单帧图像的超分辨率重构技术 ✳️ 2.1 最近邻域插值法 ✳️ 2.2 双线性插值法 ✳️ 2.3 双三次插值法(Keys'插值) ✳️ 三.神经网络 ...

  7. [数值分析拟合]Matlab三次样条插值拟合数据

    三次样条插值是一种运用极为广泛的工程插值算法,本文章编写的函数默认使用端点处的导数值代替给定的两端点的导数值使用三转角构造法进行插值(该函数也可传入端点导数数值进行分析),对数据进行方便而迅速的拟合( ...

  8. aitken插值方法的c++代码_无人驾驶路径规划技术-三次样条插值曲线及Python代码实现...

    自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的.碰撞避免的行驶路径和舒适的运动速度.生成行驶路径最经典方法之一就是是Sampling ...

  9. 非均匀三次B样条曲线插值实现及MATLAB代码

    这篇博客跟我上一篇博客<均匀三次B样条曲线插值实现及MATLAB代码>的内容有点像,只是在基函数的计算上不同,造成均匀/非均匀的区别. 参考资料: [1](这个PPT讲得很通俗,但对于多插 ...

最新文章

  1. R语言dim函数获取dataframe、matrix的维度、shape实战
  2. 一文详解科研中的Paper阅读方法!!!
  3. 用g.raphael.js高速绘制饼图、柱状图、点状图、折线图(上)
  4. Linux系统下Oracle11g r1的安装之四: 开始安装Oracle
  5. 各种 Java Thread State 第一分析法则
  6. 每天一道LeetCode-----给定序列中2/3/4个元素的和为target的所有集合,或3个元素的和最接近target的集合
  7. swift变量和函数
  8. 13001.udp广播接收程序(python)
  9. VSCode每打开一次文件弹出一个git弹窗:-login -i rev-parse --show-toplevel
  10. android rtc 不能写时间到 rtc 原因分析
  11. nhibernate配置教程
  12. SQL SERVER中的二种获得自增长ID的方法
  13. 办公用品管理系统VB——模块
  14. Android AP模式下获取SSID/PASSWORD
  15. Web---HTTP请求、重定向、转发和数据压缩
  16. 读书笔记-01大型网站架构演化的价值观
  17. XLSTransformer生成excel文件简单示例
  18. SpringBoot添加FastJson消息转换器(自用)
  19. ARC093F - Dark Horse
  20. 无网络rpm包安装相关依赖包

热门文章

  1. 【openMP并行计算】计算π
  2. 小白也学得会!Python编程超简单方法算圆周率
  3. PyTorch中的squeeze()和unsqueeze()详解与应用案例
  4. DetailsView
  5. Linux 驱动简介
  6. 【计算机视觉】全景相机标定(MATLAB/opencv)
  7. 利用媒体查询实现仿星巴克首页布局页面
  8. op07数据手册分析
  9. android手机8g内存够用嘛,安卓手机8G内存和12G内存有啥区别?
  10. Window 任务栏里面Idea图标出现空白