Python数值计算(18)——三次样条曲线概述

news2024/11/13 9:43:56

1. 概述

前面介绍到了多种插值方法,但是这些插值方法都无法避免龙格现象,即高阶多项式可能存在剧烈的振动,而且在区间的一个点处的微小扰动,都可能引起整个范围内的巨大振动,一种替代方式是使用类似线性插值的方式,将区间分成多个子区间,然后在每个子区间上构造不同的多项式来逼近,这种方式就是分段多项式。

但是,线性插值的表现会存在一个显著的现象就是插值点处一阶导不存在,在曲线上表现出来的是尖点,如果使用分段的Hermite多项式,虽然可以保证可导性,但是导数值有时并不是可以预先获取的。

最后,一个普遍的分段多项式是在使用三次多项式,即所谓的三次样条(Cubic Spline)插值。样条,英语为Spline,是Sample line的含义,意思是指通过一组给定点集来生成平滑曲线的柔性带。此概念源于生产实践,“样条”是绘制曲线的一种绘图工具,是富有弹性的细长条。绘图时用压铁使样条通过指定的形值点(样点),并调整样条使它具有满意的形状,然后沿样条画出曲线。

最初,样条曲线都是借助于物理样条得到的,放样员把富有弹性的细木条(或有机玻璃条),用压铁固定在曲线应该通过的给定型值点处,样条做自然弯曲所绘制出来的曲线就是样条曲线。样条曲线不仅通过各有序型值点,并且在各型值点处的一阶和二阶导数连续,也即该曲线具有连续的、曲率变化均匀的特点,但是需要注意的是,三次样条曲线并不能像Hermite多项式那样,在给定点处与被插函数具有相同的导函数值。

2. 数学知识

一个三次多项式具有f(x)=a+bx+cx^2+dx^3的形式,那么问题的重点就是确定系数a,b,c,d。对于给定区间[a,b]上的函数f(x)和一组插值点a = x_0<x_1<...<x_n=bf(x)的一个三次样条插值多项式应满足如下条件:

  1. 对于j=0,1,...,n-1S(x)是子区间[x_j,x_{j+1}]上的一个三次多项式,记作S_j(x)
  2. 对于j=0,1,...,n-1S_j(x_j)=f(x_j)S_j(x_{j+1})=f(x_{j+1}) 
  3. 对于j=0,1,...,n-2S_j(x_{j+1})=S_{j+1}(x_{j+1})
  4. 对于j=0,1,...,n-2S'_j(x_{j+1})=S'_{j+1}(x_{j+1})
  5. 对于j=0,1,...,n-2S''_j(x_{j+1})=S''_{j+1}(x_{j+1})

由于我们将区间分为了n段,然后每段上需要确定多项式的系数a_j,b_j,c_j,d_j,因此一共要计算4n个常数。由条件2和3,每个子区间上首位函数值,可以构造2n个方程,由条件4和5各可以构造(n-1)个方程,总共可以构造2n+2*(n-1)=(4n-2)个方程,方程数量少于未知数数量(4n),因此还缺少条件,不能完全求解。为了构造可求解的方程组,需要补充边界条件,通常是两个端点处的导数值,一般分为三种情况:

1. 紧固(Clamped)三次样条曲线:端点处的一阶导数值为给定值,即S'(x_0)=f'(x_0),S'(x_n)=f'(x_n),也叫做夹持三次样条曲线,这种情况相当于是在两个端点也增加了约束;

2. 自然(Natural)三次样条曲线:端点处的二阶导数值为0,S''(x_0)=S''(x_n)=0,也叫自由三次样条曲线,这种情况相当于两个端点被放开,没有约束;

3. 非扭结(Not-a-knot)三次样条曲线:起始2个点和结尾两个点的三阶导数值相同,S'''(x_0)=S'''(x_1),S'''(x_{n-2})=S'''(x_{n-1}),这表明最开始两个子区间和最后的两个子区间,其多项式相同,因此,[x_0,x_2]上是同一个三次多项式,[x_{n-2},x_n]上也是同一个三次多项式,x_1,x_{n-1}实际上是可有可无的,也就是说,它们起不到扭结点的作用了,所以被称作not-a-knot样条曲线,这种是方式是一般在无法获取端点处导数值时比较好的一种选择。

此外,由于紧固样条曲线使用到了更多被查函数的信息,因此拟合的效果会比自然三次样条曲线更好一些。

3. 公式推导

3.1 紧固三次样条曲线

如果用h_j=x_{j+1}-x_j表示各区间的步长,则a_{j+1}=a_j+b_jh_j+c_jh_j^2+d_jh_j^3,且显然有a_j=f(x_j),但需要注意,最后所求的曲线方程为:S_j(x)=a_j+b_j(x-x_j)+c_j(x-x_j)^2+d_j(x-x_j)^3

可以得到紧固三次样条曲线的方程为:

Ax=b

其中:

由于以上方程是严格对角占优的,因此一定存在解,所求x就是待求系数a_j,b_j,c_j,d_jc_j的值,再使用:

c_{j+1}=c_j+3d_jh_j

可计算d_j

最后可以通过:

b_{j+1}=b_j+2c_jh_j+3d_jh_j^2

计算出b_j

3.2 自然三次样条曲线

对于自然三次样条曲线,其计算过程相同,但是方程需要有所调整,即A与b的第一行和最后一行,调整如下:

 3.3 非扭结三次样条曲线

根据前面的定义,方程变为:

4. 总结

三种不同三次样条曲线的边界条件,如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python进阶 JSON数据,pyecharts制图

目录 json数据格式的转换 什么是json json本质 注意 pyecharts快速入门 画一个最简单的折线图 使用全局配置选项优化折线图 总结 json数据格式的转换 什么是json 一种轻量级的数据交换格式&#xff0c;可以按json指定的格式去组织和封装数据 json本质 带有特定格式的…

OpenSPG安装部署

文章目录 前言一、安装前准备安装docker安装docker compose 二、安装服务端下载 docker-compose.yml 文件启动服务端 三、安装客户端拉取镜像克隆OpenSPG源码 案例 前言 OpenSPG是以SPG框架为基础设计和实现的知识图谱开放引擎&#xff0c;它为领域图谱构建提供了明确的语义表…

数据结构1绪论

一、数据结构的绪论的思维导图 二、数据 1.数据是描述客观存在事务的符号&#xff0c;其能被计算机识别&#xff0c;处理。 数据不仅仅是整型&#xff0c;实型等数值类型&#xff0c;还包括声音&#xff0c;视频&#xff0c;图像等。 三、数据元素 1.数据元素是组成数据的有…

PTA—基础编程题目集(7-20)

7-20 打印九九口诀表 目录 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 参考代码 总结 题目描述 下面是一个完整的下三角九九口诀表&#xff1a; 1*11 1*22 2*24 1*33 2*36 3*39 1*44 2*48 …

js基础-作用域与作用域链

什么是作用域&#xff1f; 简单说就是在代码中定义的变量或者函数能起作用的范围 什么是作用域链&#xff1f; 简单说就是JavaScript 在执行时查找变量的过程&#xff0c;它按照从当前作用域到全局作用域的顺序逐层向上搜索&#xff0c;直到找到变量或到达作用域的顶…

C#进阶-轻量级ORM框架Dapper的使用教程与原理详解

本文详细介绍了Dapper在C#中的使用方法&#xff0c;包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用&#xff0c;并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐&#xff0c;适用于各种数据库操作需…

基于环形拓扑的多目标粒子群优化算法(MO_Ring_PSO_SCD)求解无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节&#xff0c;无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

怎么智能化管理公司众多电脑?公司电脑太多怎么管控!智慧运维,精准管控的它来啦!

俗语称&#xff1a;“团结则强&#xff0c;分散则弱&#xff1b;集腋成裘&#xff0c;聚沙成塔。” 面对公司里如繁星般的电脑大军&#xff0c;你是否曾感到管理无力&#xff0c;仿佛在与一群“不羁的野马”较劲&#xff1f;别担心&#xff0c;智慧运维的浪潮已经席卷而来&…

Mybatis学习(3)

目录 一、JDBC vs Mybatis 二、Mybatis Plugin 三、Dao接口和xml文件的sql如何建立关联 四、Mybatis如何将sql执行结果封装为目标对象并返回的&#xff1f;都有哪些映射形式&#xff1f; 五、动态SQL 六、一级缓存和二级缓存 七、接口绑定的实现 八、Mybatis vs Hiberna…

Mybatis的注解开发学习笔记

学习视频:5001 Select注解_哔哩哔哩_bilibili~5009 案例&#xff1a;基于MyBatis注解的学生管理程序_哔哩哔哩_bilibili 目录 1.基于注解的单表增删改查 1.1Select注解 1.2Insert注解 1.3Update注解 1.4Delete注解 1.5Param注解 2.基于注解的关联查询 2.1一对一查询 2.2…

[Meachines] [Easy] nibbles Nibbleblog-Upload

信息收集 IP AddressOpening Ports10.10.10.75TCP:22,80 $ nmap -p- 10.10.10.75 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 c4:f8:ad:e8:f8:04:…

实践致知第17享:电脑忽然黑屏的常见原因及处理方法

一、背景需求 小姑电话说&#xff1a;最近&#xff0c;电脑忽然就黑屏了&#xff08;如下图所示&#xff09;&#xff0c;但是等待几十秒甚至一分钟&#xff0c;电脑就能自然恢复了&#xff0c;这种状况一天能出现三四次&#xff0c;怎么办&#xff1f; 二、分析诊断 电脑黑屏…

C++从入门到起飞之——string类用法 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 两个面试题(先不做讲解) 2. 标准库中…

IMYAI智能助手介绍:全能AI工具箱,AI爱好者AIGC系统的首选。

IMYAI系统官方网站&#xff1a;https://new.imyai.top 引言&#xff1a; IMYAI系统是一款集多种先进AI技术于一身的创作工具箱&#xff0c;为用户提供无限的创作可能。不论您是想创作精彩的文章&#xff0c;还是创作精美的绘画作品&#xff0c;IMYAI系统都能满足您的需求。它集…

不想要反馈的错误遮挡页面,,想让它在控制台提示

开始页面是这样的 然后在vue.config.js 中修改 devServer: {client: {//当出现编译错误或警告时&#xff0c;在浏览器中是否显示全屏覆盖。 示例为只显示错误信息overlay: {runtimeErrors: false,},},},然后关闭服务&#xff0c;重新运行项目。 结果

【Netty】netty启动流程源码解析

文章目录 Netty整体架构一个启动流程源码解析new NioEventLoopGroup(1)构建线程池基础信息构建线程选择策略 groupchannelhandlerchildHandlerbindinitAndRegister反射创建 NioServerSocketChannel 对象init 注册channeldoBind0 流程图思考 Netty整体架构 是什么&#xff1a; N…

【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学习效果 = 时间 x 注意力 x 精力 x 目标 x 策略 )

文章目录 一、高效学习因素1、开始学习2、高效学习因素五大因素3、高效学习公式 - 学习效果 时间 x 注意力 x 精力 x 目标 x 策略 一、高效学习因素 1、开始学习 对于 学习差 , 调皮捣蛋 的学生 , 不要把 学习成绩差 的 原因 归因为 不爱学习 / 没有学习方法 , 可能是 还没有 …

Docker-学习笔记(借助宝塔面板)

ubuntu环境 一、安装 可以参考官网进行或其他博客进行安装 1.进入宝塔面板 进图Docker菜单&#xff0c;查看是否提示安装。 2.查看是否安装 查看版本 docker -v 证明已经安装 二、常用命令 1.查看版本 docker -v 2.启动、停止、重启docker systemctl start docker…

windows C++-通过 C++/WinRT 使用 API(一)

本文介绍如何使用 C/WinRT API&#xff0c;无论它们是 Windows 的一部分、由第三方组件供应商或自行实现。 本文中的代码示例较短&#xff0c;并且很容易试验&#xff0c;可以通过创建新的 Windows 控制台应用程序 (C/WinRT) 项目和复制粘贴代码来重现它们。 但是&#xff0c;…

【Redis】浅谈架构和认识Redis

目录 架构演进 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 冷热分离架构&#xff08;引入缓存&#xff09; 垂直分库 微服务架构 认识Redis Redis的特性 架构演进 单机架构 简单来说就是只有一台服务器&#xff0c;这个服务器用来负责所有…