reference:https://blog.csdn.net/deramer1/article/details/79034201

import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl"""
三次样条实现:
函数的自变量x:3, 4.5, 7, 9
函数的因变量y:2.5, 10, 2.5, 10.5
"""
x = [3, 4.5, 7, 9, 13]
y = [2.5, 10, 2.5, 10.5, 2]"""
功能:完后对三次样条函数求解方程参数的输入
参数:要进行三次样条曲线计算的自变量
返回值:方程的参数
"""def calculateEquationParameters(x):'''代解未知数为a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3:param x::return: parameter'''# parameter为二维数组,用来存放参数,sizeOfInterval是用来存放区间的个数parameter = []n = len(x)sizeOfInterval = n - 1  # 线段数i = 1# 首先输入方程两边相邻  节点  处函数值相等的方程为2(n-2)=4个方程; n个点要减去两个端点,然后乘以2while i <= n-2:# x[i]代入点i前一条线段的参数data = np.zeros(sizeOfInterval * 4)data[(i - 1) * 4] = x[i] * x[i] * x[i]data[(i - 1) * 4 + 1] = x[i] * x[i]data[(i - 1) * 4 + 2] = x[i]data[(i - 1) * 4 + 3] = 1# x[i]代入点i后一条线段的参数data1 = np.zeros(sizeOfInterval * 4)data1[i * 4] = x[i] * x[i] * x[i]data1[i * 4 + 1] = x[i] * x[i]data1[i * 4 + 2] = x[i]data1[i * 4 + 3] = 1parameter.append(data)parameter.append(data1)i += 1# 输入   端点   处的函数值。为2个方程data = np.zeros(sizeOfInterval * 4)# 第一条线段data[0] = x[0] * x[0] * x[0]data[1] = x[0] * x[0]data[2] = x[0]data[3] = 1parameter.append(data)data = np.zeros(sizeOfInterval * 4)# 最后一条线段data[-4] = x[-1] * x[-1] * x[-1]data[-3] = x[-1] * x[-1]data[-2] = x[-1]data[-1] = 1parameter.append(data)# 节点点函数一阶导数值相等为n-2=2个方程。i = 1while i <= n-2:data = np.zeros(sizeOfInterval * 4)data[(i - 1) * 4] = 3 * x[i] * x[i]data[(i - 1) * 4 + 1] = 2 * x[i]data[(i - 1) * 4 + 2] = 1data[i * 4] = -3 * x[i] * x[i]data[i * 4 + 1] = -2 * x[i]data[i * 4 + 2] = -1# temp = data[2:]# parameter.append(temp)parameter.append(data)i += 1# 节点函数二阶导数值相等为n-2=2个方程。且端点处的函数值的二阶导数为零,为2个方程。i = 1while i <= n-2:data = np.zeros(sizeOfInterval * 4)data[(i - 1) * 4] = 6 * x[i]data[(i - 1) * 4 + 1] = 2data[i * 4] = -6 * x[i]data[i * 4 + 1] = -2# temp = data[2:]# parameter.append(temp)parameter.append(data)i += 1# 总共2(n-1)-2=10个方程parameter = np.array(parameter)return parameter[:, 2:]  # 去掉前两个a1,b1"""
功能:计算样条函数的系数。
参数:parametes为方程的系数,y为要插值函数的因变量。
返回值:三次插值函数的系数。
"""def solutionOfEquation(parametes, y):n = len(x)sizeOfInterval = n - 1result = np.zeros(sizeOfInterval * 4 - 2)i = 1# 节点处方程右边while i < sizeOfInterval:  # result[0,1,2,3]result[(i - 1) * 2] = y[i]result[(i - 1) * 2 + 1] = y[i]i += 1# 起末端点处方程右边result[(sizeOfInterval - 1) * 2] = y[0]result[(sizeOfInterval - 1) * 2 + 1] = y[-1]a = np.array(parametes)b = np.array(result)return np.linalg.solve(a, b)  # 解线性方程组"""
功能:根据所给参数,计算三次函数的函数值:
参数:parameters为二次函数的系数,x为自变量
返回值:为函数的因变量
"""def calculate(paremeters, x):result = []for data_x in x:y = paremeters[0] * data_x * data_x * data_x + paremeters[1] * data_x * data_x + paremeters[2] * data_x + paremeters[3]result.append(y)return result"""
功能:采点
参数:x
返回值:采取点和采取点的函数值
"""def grasp_sample(x):n = len(x)i = 1# result 为求解出来后的a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3result = [0, 0]temp = solutionOfEquation(calculateEquationParameters(x), y)result.extend(temp)samples_x = []samples_y = []# n-1段曲线while i < n:sample_x = np.arange(x[i-1], x[i], 0.01)sample_y = calculate(result[(i-1)*4:i*4], sample_x)samples_x.extend(sample_x)samples_y.extend(sample_y)i = i+1samples_x.append(x[n-1])samples_y.extend(calculate(result[-4:], [x[n-1]]))return [samples_x, samples_y]"""
功能:将函数绘制成图像
参数:data_x,data_y为离散的点.new_data_x,new_data_y为由拉格朗日插值函数计算的值。x为函数的预测值。
返回值:空
"""def Draw(data_x, data_y, new_data_x, new_data_y):plt.plot(new_data_x, new_data_y, label="拟合曲线", color="black")plt.scatter(data_x, data_y, label="离散数据", color="red")mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falseplt.title("三次样条函数")plt.legend(loc="upper left")plt.show()samples = grasp_sample(x)
# print(samples[0])
# print(samples[1])
Draw(x, y, samples[0], samples[1])

样本点:

运行结果图

三次样条曲线 python实现相关推荐

  1. 机械臂规划----三次样条曲线

    机械臂规划----三次样条曲线 原理讲解 源代码 三次样条曲线将稀疏点变成稠密点,是常用的一种规划方法. 原理讲解 源代码 #!/usr/bin/env python #-*-coding:utf-8 ...

  2. MATLAB---构造一个插值三次样条曲线

    function InterpCubicSplineCurv() %本程序的功能是构造一个插值三次样条曲线N = 12; SamplPs = CollectSPFergusonCi2(N);%采集型值 ...

  3. java三次样条函数求导_利用java语言对三次样条曲线的实现

    Java语言中关于曲线问题的高级应用开发在jdk尚未支援2D图形之前,只可以画出直的.相同粗细的线条.现在可以通过2DAPI绘出不同粗细的线条及圆滑的曲线.通过系统java.awt.geom包中提供了 ...

  4. matlab导数曲线怎样画,matlab三次样条曲线的绘制(spline和csape函数详解)

    matlab三次样条函数的绘制(spline和csape函数详解) 样条函数是工程中常用的插值函数.早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿 ...

  5. 三次样条曲线CubicSpline

    本文参考老张在上海轨迹规划 之 三次样条曲线(概念+性质) - 知乎 (zhihu.com) 什么是三次样条曲线 之 三次 样条是一种数据插值的方式,在多项式插值中,多项式是给出的单一公式来尽可能满足 ...

  6. 三次样条曲线插值的基本原理及其C#实现

    声明:本人空间的所有文章,若无特别声明,皆为本人原创,可自由转载,但要注明原作者和原始出处,不可作为商业用途. 下面的内容是直接从Word文档复制粘贴出来的,有很多内容丢失,完整的PDF版本可到百度网 ...

  7. 三次样条曲线插值(cubic spline)实例应用

    目标 工作需要,需要达成这样得一个需求,给一系列得三维点,三维点按照顺序连接,形成一条折线.需要依照这条折线,进行曲线1m等距离插值.具体如下图 其中,红色圆圈点为原始点集OrigPoints(原始点 ...

  8. matlab三次样条曲线的绘制(spline和csape函数详解)

    matlab三次样条函数的绘制(spline和csape函数详解) 前言 1.spline函数详解 1.一维非节点边界 2.第二边界条件 3.高维无约束 4.高维第二边界 5.利用第二边界条件绘制圆 ...

  9. python画曲线-Python绘制各种简单优美曲线

    原标题:Python绘制各种简单优美曲线 matplotlib是著名的Python绘图库,它提供了一整套绘图API,十分适合交互式绘图.,解决数据分析和可视化问题,其实也是Python的拿手好戏.另外 ...

最新文章

  1. Java项目:CRM客户管理系统(java+SSM+jsp+mysql+maven)
  2. Jmeter学习记录的知识点
  3. ZOJ 3820 Building Fire Stations
  4. 设计模式中必须知道的一些原则
  5. Nginx添加SSL的支持
  6. 推荐一个好用的Chrome扩展应用,管理新建标签页面的
  7. 行车记录仪设置php,行车记录仪怎么调设置
  8. 利用border制作三角形原理
  9. 用java实现etcd分布式锁_etcd分布式锁及事务
  10. JSP标准标签库、通用标签
  11. 微信高并发资金交易系统设计方案——百亿红包背后的技术支撑
  12. 5)Thymeleaf 模板布局 th:fragment、th:replace、th:insert、th:remove
  13. UNIX文件系统概述
  14. 矢量数据空间索引之R树索引
  15. linux redis命令客户端,Redis客户端与基本命令
  16. ICCMO微信公众账号开发系列(1)接入微信公众账号
  17. 2021-2027全球与中国拆弹机器人市场现状及未来发展趋势
  18. 银行系统日终结算要多久_银行 核心系统的清算与结算 - 系统性能与软件架构 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  19. 基于Vue3+Go本地视频管理与播放系统设计与实现
  20. POJ 2385: Apple Catching

热门文章

  1. 《笑傲江湖》人名解读
  2. linux的swap与memory,【Linux】Linux中Swap与Memory内存简单介绍
  3. Wordvice推出人工智能工具 免费论文润色功能受欢迎
  4. OH----调试T7520过程中对 linux usb dwc3的总结
  5. Android面试整理
  6. java ebcdic编码转换_EBCDIC编码转换为ASCII编码
  7. 中国科学院大学计算机考研信息汇总
  8. java中的画图公式_GitHub - oneSaber/Compiler-java: 函数绘图语言java实现
  9. 构建高可用的方式总结
  10. oracle 拼音首字母查询,ORACLE 中文列 按拼音首字母查询 升级版