三次样条插值算法及推导过程

目录

  • 1、定义
  • 2、已知条件求解
  • 3、具体推导
  • 4、matlab案例
  • 5、案例结果
  • 6、matlab仿真

1、定义

  给定 n + 1 n+1 n+1个数据点,共有 n n n个区间,三次样条方程 S ( n ) S(n) S(n)满足以下条件:在每个分段区间内 ( x i , x i + 1 ) (x_i,x_{i+1}) (xi,xi+1)( i = 0 , 1 , . . . , n − 1 , x i=0,1,...,n-1,x i=0,1,...,n1,x递增), S ( x ) = S i ( x ) S(x)=S_i(x) S(x)=Si(x)是一个三次多项式;满足 S ( x i ) = y i ( i = 0 , 1 , . . . , n ) S(x_i)=y_i(i=0,1,...,n) S(xi)=yi(i=0,1,...,n); 导数 S ′ ( x ) S'(x) S(x)、二阶导数 S ′ ′ ( x ) S''(x) S′′(x)在区间是连续的,即 S ( x ) S(x) S(x)曲线是光滑的。

  那么 n n n个三次多项式分段可以写作:
S i ( x ) = a i + b i ( x − x i ) + c i ( x − x i ) 2 + d i ( x − x i ) 3 (1) S_i(x)=a_i+b_i(x-x_i)+c_i(x-x_i)^2+d_i(x-x_i)^3\tag{1} Si(x)=ai+bi(xxi)+ci(xxi)2+di(xxi)3(1)
i = 0 , 1 , . . . , n − 1 i=0,1,...,n-1 i=0,1,...,n1
其中: a i 、 b i 、 c i 、 d i a_i、b_i、c_i、d_i aibicidi代表 4 n 4n 4n个未知数。

2、已知条件求解

在这里插入图片描述

3、具体推导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、matlab案例

clc;
clear;P = [4.0,4.2;4.3 5.7;4.6,6.6;5.3,4.8;5.9,4.6];x = P(:,1);
y = P(:,2);xx = linspace(min(x),max(x),20);
yy = csapi(x,y,xx); % 三次样条插值
plot(x,y,'b*',xx,yy,'r-',LineWidth=2)
title('Cubic Spline Interpolant')

5、案例结果

在这里插入图片描述

6、matlab仿真

4的案例代码是我自己实现的,做实验应付用足够。做研究还是要清楚具体实现过程的,于是乎,需要详细过程实现。仿真代码来自:三次样条Cubic Spline简介。其他博客翻阅了有数百篇,没一个好用的。

clc;
clear;
close;P = [4.0,4.2;4.3 5.7;4.6,6.6;5.3,4.8;5.9,4.6];x = P(:,1);
y = P(:,2);% 计算矩阵A,B
n = size(x,1);
h = arr_diff(x);
A = calc_A(n,h);
B = calc_B(n,y,h);% 求解abcd
a = y;
b = zeros(n-1,1);
c = A^-1*B;
d = zeros(n-1,1);for i=1:n-1d(i) = (c(i+1)-c(i))/(3*h(i));b(i) = (a(i+1)-a(i))/h(i) - h(i)*(c(i+1)+2*c(i))/3;
end% 绘制原始点
plot(x,y,'b*',LineWidth=2);hold on% 三次样条曲线点采样
accuracy = 0.1;
num = int32((max(x) - min(x))/accuracy) + 1;
pnt = zeros(num,2);
i = 1;
for v = min(x):accuracy:max(x)idx = find_latest_index(v,x);ai = a(idx);bi = b(idx);ci = c(idx);di = d(idx);dx = v - x(idx);w = ((di*dx + ci)*dx + bi)*dx + ai;pnt(i,1) = v;pnt(i,2) = w;i = i+1;
end
plot(pnt(:,1),pnt(:,2),'r-',LineWidth=2);% 求差值函数
function h = arr_diff(a)sz = size(a,1);h = zeros(sz-1,1);for i=1:sz-1h(i) = a(i+1)-a(i);end
end% 计算A矩阵
function A = calc_A(n,h)A = zeros(n,n);A(1,1) = 1;for i=1:n-1if i ~= n-1A(i+1,i+1) = 2*(h(i) + h(i+1));endA(i,i+1) = h(i);A(i+1,i) = h(i);endA(1,2) = 0;A(n,n-1) = 0;A(n,n) = 1;
end% 计算B矩阵
function B = calc_B(n,y,h)B = zeros(n,1);for i = 1:n-2B(i+1) = 3*((y(i+2)-y(i+1))/h(i+1) - (y(i+1)-y(i))/h(i));end
end% 计算s中不大于si的值的最大索引
function idx = find_latest_index(si,s)[row,~] = size(s);if si <= 0 || row <= 1idx = 1;return;endfor i=2:rowif(s(i-1,1) <= si && si <= s(i,1))idx = i-1;return;endendidx = row;
end

三次样条插值法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构从小白到大牛]第五篇:3分钟带你吃透双链表并用C语言模拟实现

目录 1->前言 2->链表的概念和结构 2.1链表概念 2.2->带头双向循环链表结构 3->模拟实现带头双向循环链表 3.1定义链表结点 struct ListNode 3.2创建链表结点 CreateLTNode 函数 3.3链表初始化函数 ListInit函数 3.4链表打印函数 ListPrint函数 3.5链表…

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面&#xff08;GUI&#xff09;。对于不熟悉 Kubernetes 复杂的命令行操作&#xff08;如使用kubectl&#xff09;的用户来说&#xff0c;通过 Rancher 的界面可以方便地进行资源管理。例如&#xff0c;用户可以在…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班&#xff0c;没有时间整理照片&#xff0c;偶尔导一次&#xff0c;几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接&#xff0c;速度更快、更稳定&#xff0c;不会出现数据线连接时碰碰就断网的问题 1、先打开电…

CDGP|企业数据治理流程全解析

在当今信息化时代&#xff0c;数据已成为企业最重要的资产之一。为了充分发挥数据的价值&#xff0c;企业需要对数据进行全面、系统的治理。企业数据治理流程是一套确保数据质量、安全性和合规性的规范化流程&#xff0c;涵盖了从数据采集到销毁的全过程。本文将详细介绍一般企…

学习threejs,将多个网格合并成一个网格

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Geometry 几何体1.2 …

Linux 线程控制

一. 线程互斥 1.1 线程互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

企业CRM管理系统PHP源码/PHP客户关系CRM客户管理系统源码

系统功能实现 1、 公海管理:公海类型、客户公海。 2、 线索管理:我的线索、线索列表、线索状态、线索来源。 3、 客户管理:我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客户级别。 4、 业绩订单:订单列表、我的订单。 5、 系统设置:系统设置…

设置JAVA以适配华为2288HV2服务器的KVM控制台

华为2288HV2服务器比较老旧了&#xff0c;其管理控制台登录java配置比较麻烦&#xff0c;华为的ibmc_kvm_client_windows客户端测试了几个版本&#xff0c;连接控制台也有问题&#xff0c;最终安装JDK解决。 一、测试环境 主机为WindowsServer2012R2,64位系统 二、Java软件包…

10大软件使用感受分享,数据恢复的得力助手!!

在找数据恢复软件&#xff1f;&#xff01;是不是存在误删重要文件或遭遇硬盘故障&#xff0c;想要找回丢失的数据&#xff1f;别担心&#xff0c;今天我就来给大家分享10款我亲自使用过的数据恢复软件&#xff0c;分别给你说说它们各自的优缺点&#xff0c;希望能帮你们在数据…

一周模电速成(3) 超详细!入门小白速成!!!

目录 稳压二极管 整流二极管 晶体三极管 三极管结构图 三极管的特点 1、如何让它工作在放大状态呢 2、如何工作在截止状态呢&#xff1f; 3、如何让三极管工作在饱和状态呢&#xff1f; 在电路中要如何实现呢&#xff1f;工作在各个状态有什么特点呢&#xff1f; 截止…

Python的条件语句if与match...case

一、定义 条件语句&#xff0c;也叫作选择语句、判断语句。根绝特定条件判断是否成立&#xff0c;执行不同的语句段。简单来说&#xff0c;满足条件执行&#xff0c;不满足不执行。 条件语句是使用关键字 if 做判断&#xff0c;根据不同情况结合不同的关键字else 或者 elif来…

SpringBoot基础系列学习(二):日志

文章目录 一丶日志控制台介绍二丶日志的用法三丶日志级别四丶配置文件参数及介绍五丶slf4j 一丶日志控制台介绍 只要引用了spring-boot-starter依赖,就无需引入日志依赖,里面自带了logging依赖,默认情况下,springBoot使用Logback来记录日志,并用INFO级别输出到控制台 二丶日…

Bert模型介绍

简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一个基于Transformer的双向编码器表示模型&#xff0c;它通过预训练学习到了丰富的语言表示&#xff0c;并可以用于各种自然语言处理任务。 模型结构&#xff1a;BERT基于Transf…

AI驱动无人驾驶:安全与效率能否兼得?

内容概要 如今&#xff0c;人工智能正以其神奇的魔力驱动着无人驾驶的浪潮&#xff0c;带来了无数令人兴奋的可能性。这一领域的最新动态显示&#xff0c;AI技术在车辆的决策过程和实时数据分析中发挥着重要作用&#xff0c;帮助车辆更聪明地应对复杂的交通环境。通过实时监测…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…

从零开始的c++之旅——多态

1. 多态的概念 通俗来说就是多种形态。 多态分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;。 编译时多态主要就是我们之前提过的函数重载和函数模板&#xff0c;同名提高传不同的参数就可以调 用不同的函数&#xff0c…

linux node vue3 部署手册

第一步&#xff1a;在linux 系统中安装node 1、在网址&#xff1a;https://nodejs.org/dist/ 下载对应版本的安装包。 2、解压缩下载的压缩包到任意位置&#xff0c;推荐home下。 样例路径为&#xff1a;/home/syl/node-v20.17.0-linux-x64.tar.xz 样例&#xff1a; tar -xv…

探索C/C++的奥秘之string类

string叫串&#xff0c;是一个管理字符数组的类&#xff0c;其实就是一个字符数组的顺序表&#xff0c;通过成员函数对字符串进行增、删、查、改。 C标准库里面的东西都在std这个命名空间中。 int main() { string s1; std:: string s2; std::string name("x…

【刷题】优选算法

优选算法 双指针 202. 快乐数 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 【思路】 第一个实例是快乐数&#xff0c;因为会变为1且不断是1的循环 第二个实例不可能为1&#xff0c;因为会陷入一个没有1的循环 根据两个实例和鸽巢原理可以发现不断的平方和最…