Python数值计算(20)——自然三次样条曲线

news2024/9/23 1:36:03

前面介绍到紧固三次样条曲线,这次介绍一下自然三次样条曲线。

1. 数学知识

这个在前面已经做过介绍,这里再次重复说明一遍,它对我们算法实现具有很大的帮助:

同样的,a_j就是各分段起点的函数值,通过上述方程组求解出每一个c_j以后,可以把d_j,b_j计算出来。

2. 算法实现

和紧固三次样条曲线一样,我们用一个类来实现插值算法,以及其他的方法、属性,这样就可以在后续实现方便的多值估算和绘图,最终实现代码如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial
from numpy import linalg
from scipy.interpolate import CubicSpline
np.polynomial.set_default_printstyle("unicode")

class ncsIntp:
    __coef=None
    __bpx=None
    __bpy=None
    def __init__(self,x:np.ndarray,y:np.ndarray):
        '''
        自然三次样条曲线
        '''
        n,=x.shape
        h=np.diff(x)
        a=y.copy()
        dy=np.diff(y)
        A=np.zeros((n,n))         
        A[0,0]=1
        A[-1,-1]=1
        B=np.zeros(n)
        for i in range(1,n-1):
            A[i,i-1:i+2]=[h[i-1],2*(h[i-1]+h[i]),h[i]]
            B[i]=3*dy[i]/h[i]-3*dy[i-1]/h[i-1]
        c=linalg.solve(A,B)
        d=np.zeros(n)
        b=np.zeros(n)
        for j in range(n-1):
            d[j]=(c[j+1]-c[j])/3/h[j]
            b[j]=dy[j]/h[j]-h[j]/3*(2*c[j]+c[j+1])
        self.__coef=np.array([a,b,c,d])[:,:-1].T
        self.__bpx=x.copy()
        self.__bpy=y.copy()

    def __call__(self,w):
        n,=w.shape
        ret= np.zeros(n)
        for i in range(n):
            if self.__bpx[0]>=w[i]:
                ret[i]=self.__bpy[0]
                continue
            if self.__bpx[-1]<=w[i]:
                ret[i]=self.__bpy[-1]
                continue
            j=0
            while self.__bpx[j]<w[i]:
                j+=1
            cp=self.__coef[j-1,:]
            p=Polynomial([0])
            for t in range(len(cp)):
                p+=cp[t]*Polynomial([-self.__bpx[j-1],1])**t
            ret[i]=p(w[i])
        return ret
    
    @property
    def c(self):
        '''
        如果提供的是n+1个点对,则系数是shape为(n,4)的ndarray
        每一行就是一个分段区间的参数,依次记作a,b,c,d
        则该区间的样条曲线就是y=a+b*(x-xj)+c*(x-xj)**2+d*(x-xj)**3
        其中0<=j<=n-1    
        '''
        return self.__coef
    @property
    def x(self):
        return self.__bpx

3. 算法测试

采用自然三次样条插值,在[0,4]上,对函数f(x)=e^x进行拟合,假设我们知道x=0,1,2,3,4点处的函数值,以及在x=0x=4时的导数值,绘制原函数曲线,以及拟合后的曲线,代码如下:

x=np.array([0,1,2,3,4])
y=np.exp(x)

X=np.linspace(0,4,100)
Y=np.exp(X)
plt.plot(X,Y,'r')

S=ncsIntp(x,y)
Y1=S(X)
plt.plot(X,Y1,'b-.')

plt.grid()
plt.show()

绘制图形如下:

可以看到,拟合曲线与原函数的贴合程度,并没有紧固三次样条曲线那么高,这也不奇怪,毕竟紧固曲线使用了更多的原函数信息(端点处的导数值)。

4. 现有工具包

在scipy的工具包中,scipy.interpolate.CubicSpline类可以完成三次样条曲线的插值功能,构造函数原型如下:

class CubicSpline(x, y, axis=0, bc_type='not-a-knot', extrapolate=None)

其中x,y是拟合点,主要的区别是bc_type,该参数决定了边界条件,使用'natural'值时,就是自然三次样条曲线,所实现的拟合效果与第3节中相同,可以通过系数对比确认这一点:

print(sp.c)
'''
[[ 6.07155227e-01 -8.32836920e-02  4.79919365e+00 -5.32306519e+00] 
 [-2.22044605e-16  1.82146568e+00  1.57161460e+00  1.59691956e+01] 
 [ 1.11112660e+00  2.93259228e+00  6.32567257e+00  2.38664827e+01] 
 [ 1.00000000e+00  2.71828183e+00  7.38905610e+00  2.00855369e+01]]
'''
print(S.c)
'''
[[ 1.          1.1111266   0.          0.60715523] 
 [ 2.71828183  2.93259228  1.82146568 -0.08328369] 
 [ 7.3890561   6.32567257  1.5716146   4.79919365] 
 [20.08553692 23.86648273 15.96919556 -5.32306519]]
'''

同样的,系数的组织方式不同,具体细节见前1章节。

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

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

相关文章

Goland Debug大全

记录goland debug过程中遇到的所有问题&#xff0c;有一些是其他博主的总结 1. Debug模式功能 2. 去掉GoLand中的所有断点 调试时点击下图箭标所指的按钮 选中需要删除的断点&#xff0c;点击左上角的减号&#xff0c;然后保存

Java中使用OpenCV生成灰度图

一、下载OpenCV、 下载链接&#xff1a;Releases - OpenCV 下载到指定目录后双击即可安装&#xff08;正常下载过程&#xff09;。 二、查看文件目录 1、找到opencv-4100.jar 找到opencv-4100.jar&#xff0c;这个是我们需要加载的包。 opencv-460.jar是给java操作openvc的程序…

Java所需要的环境以及jdk安装

jvm和跨平台 jvm(java虚拟机):java运行程序的假想计算机,主要用来运行java程序的 跨平台:java代码可以在不同的操作系统上运行(一次编写,到处运行) 跨:跨越 平台:操作系统 -> windows linux mac os 关系:java程序想要在不同的操作系统上运行,实现跨平台,就需要安装不同版本…

C# Unity 面向对象补全计划 七大原则 之 开闭原则(OCP) 难度:☆ 总结:已经写好的就别动它了,多用继承

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;查漏补缺 1.开闭原则&#xff08;OC…

【Python】成功处理`load_boston` has been removed from scikit-learn since version 1.2.

【Python】成功处理load_boston has been removed from scikit-learn since version 1.2. 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主…

文件夹提示无法访问:深入解析与高效恢复策略

在数字化时代&#xff0c;文件夹作为我们存储、整理和保护重要数据的关键容器&#xff0c;其稳定性和可访问性对于个人工作、学习乃至企业运营都至关重要。然而&#xff0c;当您试图访问某个文件夹时&#xff0c;却遭遇“无法访问”的提示&#xff0c;这无疑会给您带来不小的困…

浅谈线程组插件之jp@gc - Stepping Thread Group

浅谈线程组插件之jpgc - Stepping Thread Group jpgc - Stepping Thread Group 是一个高级线程组插件&#xff0c;专为Apache JMeter设计。相较于JMeter自带的基本线程组&#xff0c;此插件提供了更灵活、更精细的用户模拟方式&#xff0c;特别适合于模拟真实用户逐步增加的场…

开关电源之电压的影响因素和指标

开关电源并不是一个简单的小盒子&#xff0c;它相当于有源器件的心脏&#xff0c;不断地为元件提供能量。电源质量的好坏直接影响到元器件的性能。开关电源的设计、制造和质量管理需要精密的电子仪器来模拟电源的实际工作特性&#xff08;即各种规格&#xff09;&#xff0c;经…

5_现有网络模型的使用

教程&#xff1a;现有网络模型的使用及修改_哔哩哔哩_bilibili 官方网址&#xff1a;https://pytorch.org/vision/stable/models.html#classification 初识网络模型 pytorch为我们提供了许多已经构造好的网络模型&#xff0c;我们只要将它们加载进来&#xff0c;就可以直接使…

【CONDA】库冲突解决办法

如今&#xff0c;使用PYTHON作为开发语言时&#xff0c;或多或少都会使用到conda。安装Annaconda时一般都会选择在启动终端时进入conda的base环境。该操作&#xff0c;实际上是在~/.bashrc中添加如下脚本&#xff1a; # >>> conda initialize >>> # !! Cont…

python:YOLO格式数据集图片和标注信息查看器

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何实现一个可视化图片和标签信息的查看器&#xff0c;代码使用python实现。点击下一张和上一张可以切换图片。 文章目录 一、脚本界面二、完整代码 一、脚本界面 界面如下图所示&#xff0c; 二、完整代码 使用代码时&#xff0…

无线WiFi破解原理(超详细)

大家应该都有过这样的经历&#xff0c;就是感觉自己家的无线网怎么感觉好像变慢了&#xff0c;"是不是有人蹭我家网&#xff1f;""还有的时候咱们出门也想试图蹭一下别人家的网"&#xff0c;这里"蹭网"的前提是要破解对方的"无线密码"…

SQL注入复现1-18关

一、联合查询&#xff08;1-4关&#xff09; 首先打开第一关查看源代码&#xff0c;他的闭合方式为 找到闭合方式后&#xff0c;我们就可以使用order by来确定列数 我们可以看到使用order by 4--回车时报错&#xff0c;使用order by 3--时显示&#xff0c;所以我们就得到他得列…

微信丨QQ丨TIM防撤回工具

适用于 Windows 下 PC 版微信/QQ/TIM的防撤回补丁。支持最新版微信/QQ/TIM&#xff0c;其中微信能够选择安装多开功能。微信防撤回信息&#xff01; 「防撤回」来自UC网盘分享https://drive.uc.cn/s/95f9aabbc9684

2024年起重机司机(限桥式起重机)证模拟考试题库及起重机司机(限桥式起重机)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重机司机(限桥式起重机)证模拟考试题库及起重机司机(限桥式起重机)理论考试试题是由安全生产模拟考试一点通提供&#xff0c;起重机司机(限桥式起重机)证模拟考试题库是根据起重机司机(限桥式起重机)最新版教…

elasticsearch教程

1. 单点部署(rpm): #提前关闭firewalld,否则无法组建集群 #1. 下载ES rpm包 ]# https://www.elastic.co/cn/downloads #2. 安装es ]# rpm -ivh elasticsearch-7.17.5-x86_64.rpm #3. 调整内核参数(太低的话es会启动报错) echo "vm.max_map_count655360 fs.file-max 655…

MySQL1 DDL语言

安装与配置 官网&#xff1a; MySQL :: Download MySQL Installer 阿里云&#xff1a; MySQL8 https://www.alipan.com/s/auhN4pTqpRp 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速…

外卖项目day14(day11)---数据统计

Apache ECharts 大家可以看我这篇文章&#xff1a; Apache ECharts-CSDN博客 营业额统计 产品原型 接口设计 新建admin/ReportController /*** 数据统计相关接口*/ RestController RequestMapping("/admin/report") Api(tags "数据统计相关接口") Slf…

快速解密哈希算法利器Hasher:解密MD5、SHA256、SHA512、RIPEMD160等最佳工具

文章目录 一、工具概述1.1主要功能点1.2 支持多种哈希算法 二、安装方法三、使用教程四、结语 一、工具概述 Hasher 是一个哈希破解工具,支持多达 7 种类型的哈希算法,包括 MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512 等。它具有自动检测哈希类型、支持 Windows 和 Linux…

浙大阿里联合开源AudioLCM,在通用音频合成领域实现潜在一致性模型的新突破...

文本到通用音频生成&#xff08;Text-to-Audio Generation&#xff0c;简称 TTA&#xff09;作为生成任务的一个子领域&#xff0c;涵盖了音效创作、音乐创作和合成语音&#xff0c;具有广泛的应用潜力。在此前的神经 TTA 模型中&#xff0c;潜在扩散模型&#xff08;Latent Di…