数值计算笔记之插值(四)三次样条插值 |
您所在的位置:网站首页 › 导数八条公式 › 数值计算笔记之插值(四)三次样条插值 |
0、定义
已知函数在区间上个互异节点,处的函数值为,若构造函数,满足: 在每个小区间上是一个不超过三次的多项式在上连续则称为的三次样条插值函数。 根据定义知道规律为: 已知: n+1个数据点[xi, yi], i = 0, 1, …, n 每一分段都是三次多项式函数曲线 节点达到二阶连续左右两端点处特性(自然边界,固定边界,非节点边界)根据定点,求出每段样条曲线方程中的系数,即可得到每段曲线的具体表达式。 一、推导插值和连续性: 其中. 微分连续性: 其中. 样条曲线的微分式:
将步长 带入样条曲线的条件: 得 ,. 设 ,那么 可改写为 将 带入 ,得 将 代入,得至此,可以得到一个关于m为未知数的线性方程组,通过解这个方程组,确定其系数。 二、边界条件建立方程边界条件有三种:自由边界条件、固定边界条件、非节点边界条件。 1、自由边界条件两端没有任何限制,即。求解方程为: 2、固定边界条件数据两端节点的微分值是已知的,令分别为A 和B。则有 则有 3、非节点边界条件指定样条曲线的三次微分匹配, 由 . 则有 三、代码实现 1、matlab 在matlab中,spline函数可以实现三次样条插值。例: clc; clear; //x = [ 0, 3, 5, 7, 9, 11, 12, 13, 14, 15 ]; //y = [0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6 ]; //x_ = 0:.1:15; x = -pi:pi; y = sin(x); x_ = -pi:.1:pi; p1 = spline(x,y,x_); % 分段三次样条插值 plot(x,y,'ko',x_,p1,'b.') legend('插值节点','分段三次样条插值','location','southeast')可以看出,由点组成得曲线比较平滑。 2、C++ 程序我有用到矩阵库Armadillo,没有安装的请点这个安装教程链接 #include #include #include using namespace std; using namespace arma; int main() { double x[] = { 0, 3, 5, 7, 9, 11, 12, 13, 14, 15 }; double y[] = { 0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6 }; int size = sizeof(x) / sizeof(double); const double min = x[0]; const double max = x[size - 1]; vector xx, yy; //插值点与计算的函数值 for (double i = x[0]; i = x_[j] && xx_[i] < x_[j + 1]) { k = j; break; } else if (xx[i] == x[size - 1]) { k = size - 1; } } //yy(i) = y[i] + bi(k) * (xx[i] - x[k]) + 1 / 2.0 * M(i) * pow((xx[i] - x[k]) , 2) + di(k) * pow((xx[i] - x[k]),3); double temp = ai[k] + bi[k] * (xx[i] - x[k]) + M(k) * pow((xx[i] - x[k]), 2) + di[k] * pow((xx[i] - x[k]), 3); yy.push_back(temp); } std::ofstream output; output.open("Spline.txt"); for (unsigned i = 0; i < size_xx; i++) { output |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |