三次样条插值详解(附代码实现) 您所在的位置:网站首页 三次样条函数matlab 三次样条插值详解(附代码实现)

三次样条插值详解(附代码实现)

#三次样条插值详解(附代码实现)| 来源: 网络整理| 查看: 265

文章目录 前言引入二次样条的原理二次样条代码实现三次样条的原理三次样条代码实现

前言

当已知某些点而不知道具体方程时候,最经常遇到的场景就是做实验,采集到数据的时候,我们通常有两种做法:拟合或者插值。拟合不要求方程通过所有的已知点,讲究神似,就是整体趋势一致。插值则是形似,每个已知点都必会穿过,但是高阶会出现龙格库塔现象,所以一般采用分段插值。今天我们就来说说这个分段三次样条插值。

引入

首先我们先抛开众多的回归算法不谈, 我们对于给出如下的离散的数据点,现在想根据如下的数据点来推测 x=6 时的值,我们应该采用什么方法呢?

用于拟合样条函数的数据

xf(x)3.02.54.51.07.02.59.00.5

我们知道在平面上两个点确定一条直线,三个点确定一条抛物线(假设曲线的类型是抛物线),那么现在有四个点,我们很自然的会想到,既然两个点确定一条直线,那么最简单的方法就是,两个点之间连一条线,两个点之间连一条线,最后得到的一种折线图如下:这样我们只要确定 x=6 时的直线,把自变量的值带进去,就显然会得到预测的函数值。但是,这种方法显然具有很明显的缺陷:曲线不够光滑,连接点处的斜率变化过大。可能会导致函数的一阶导数不连续。那么我们应该如何解决这个问题呢?

在这里插入图片描述

二次样条的原理

我们会想到既然直线不行,那么我们就用曲线来近似的代替和描述。最简单的曲线是二次函数,如果我们用二次函数: a x 2 + b x + c ax^2 + bx + c ax2+bx+c 来描述曲线,最后的结果可能会好一点,下图中一共有4个点,可以分成3个区间。每一个区间都需要一个二次函数来描述,一共需要9个未知数。下面的任务就是找出9个方程。

如下所示:一共有 x 0 , x 1 , x 2 , x 3 x_0,x_1,x_2,x_3 x0​,x1​,x2​,x3​四个点,三个区间,每个区间上都有一个方程。

曲线方程在节点处的值必须相等,即函数在x1,x2两个点处的值必须符合两个方程,这里一共是4个方程:

a 1 x 1 2 + b 1 x 1 + c 1 = f ( x 1 ) a_1x_1^2 + b_1x_1 + c_1 = f(x_1) a1​x12​+b1​x1​+c1​=f(x1​)

a 2 x 1 2 + b 2 x 1 + c 2 = f ( x 1 ) a_2x_1^2 + b_2x_1 + c_2 = f(x_1) a2​x12​+b2​x1​+c2​=f(x1​)

a 2 x 2 2 + b 2 x 2 + c 2 = f ( x 2 ) a_2x_2^2 + b_2x_2 + c_2 = f(x_2) a2​x22​+b2​x2​+c2​=f(x2​)

a 3 x 2 2 + b 3 x 2 + c 3 = f ( x 2 ) a_3x_2^2 + b_3x_2 + c3_ =f (x_2) a3​x22​+b3​x2​+c3=​f(x2​)

第一个端点和最后一个端点必须过第一个和最后一个方程:这里一共是2个方程

节点处的一阶导数的值必须相等。这里为两个方程。

2 a 1 x 1 + b 1 = 2 a 2 x 1 + b 2 2a_1x_1 + b_1 = 2a_2x_1 + b_2 2a1​x1​+b1​=2a2​x1​+b2​

2 a 2 x 2 + b 2 = 2 a 3 x 2 + b 3 2a_2x_2 + b_2 = 2a_3x_2 + b_3 2a2​x2​+b2​=2a3​x2​+b3​

在这里假设第一个方程的二阶导数为0:这里为一个方程:

a 1 = 0 a_1 = 0 a1​=0

上面是对应的9个方程,现在只要把九个方程联立求解,最后就可以实现预测 x=6 处节点的值。

在这里插入图片描述

下面是写成矩阵的形式,由于a1=0,所以未知数的个数少了一个

在这里插入图片描述

二次样条代码实现

下面是二次样条的python实现,最后将结果绘制在图上。

import numpy as np import matplotlib.pyplot as plt from pylab import mpl """ 二次样条实现: 函数x的自变量为:3, 4.5, 7, 9 因变量为:2.5, 1 2.5, 0.5 """ x = [3, 4.5, 7, 9] y = [2.5, 1, 2.5, 0.5] """一共有三个区间,用二次样条求解,需要有9个方程""" """ 功能:完后对二次样条函数求解方程参数的输入 参数:要进行二次样条曲线计算的自变量 返回值:方程的参数 """ def calculateEquationParameters(x): #parameter为二维数组,用来存放参数,sizeOfInterval是用来存放区间的个数 parameter = [] sizeOfInterval=len(x)-1; i = 1 #首先输入方程两边相邻节点处函数值相等的方程为2n-2个方程 while i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有