精华内容
下载资源
问答
  • 三次样条插值 三次样条插值
  • 三次样条插值代码matlab 了解三次样条插值 在2019年秋季的数值分析(2)的过程中,我与杨虎庆一起完成了有关三次样条插值的项目。 在该项目中,首先,我们给出在三种不同的最终条件下指定样条的解决方案,其中规定...
  • 样条插值

    2020-02-13 20:25:06
    样条插值的定义 函数若处处可导,即每一处的左导数和右导数均存在且相等,那么这条函数就是光滑不间断的曲线。 样条插值就是根据每两个相邻的数据点确定一段函数,然后再结合成一个函数,那么就是光滑的函数了。 ...

    样条插值的定义

    函数若处处可导,即每一处的左导数和右导数均存在且相等,那么这条函数就是光滑不间断的曲线。

    样条插值就是根据每两个相邻的数据点确定一段函数,然后再结合成一个函数,那么就是光滑的函数了。

    样条计算模式:
    在这里插入图片描述
    比较不同阶数区别

    x = np.linspace(-2*np.pi, 2*np.pi, num=10)
    f = lambda x: np.sin(x) + 0.5 * x
    x1 = np.linspace(-2*np.pi, 2*np.pi, num=50)
    plt.plot(x1, f(x1), label='True Line')
    
    tck1 = spi.splrep(x, f(x), k=1)
    tck2 = spi.splrep(x, f(x), k=2)
    tck3 = spi.splrep(x, f(x), k=3)
    tck4 = spi.splrep(x, f(x), k=4)
    x2 = np.linspace(-2*np.pi, 2*np.pi, num=50)
    iy1 = spi.splev(x2, tck1)
    iy2 = spi.splev(x2, tck2)
    iy3 = spi.splev(x2, tck3)
    iy4 = spi.splev(x2, tck4)
    plt.scatter(x2, iy1, color='r', label='First Order')
    plt.scatter(x2, iy2, color='g', label='Second Order')
    plt.scatter(x2, iy3, color='brown', label='Third Order')
    plt.scatter(x2, iy4, color='brown', label='Fourth Order')
    plt.title('Interpolation')
    plt.legend()
    
    print('————一阶拟合情况————')
    print(np.allclose(f(x2), iy1))
    print(np.sum((iy1-f(x2))**2)/len(x2))
    print('————二阶拟合情况————')
    print(np.allclose(f(x2), iy2))
    print(np.sum((iy2-f(x2))**2)/len(x2))
    print('————三阶拟合情况————')
    print(np.allclose(f(x2), iy3))
    print(np.sum((iy3-f(x2))**2)/len(x2))
    print('————四阶拟合情况————')
    print(np.allclose(f(x2), iy4))
    print(np.sum((iy4-f(x2))**2)/len(x2))
    

    ————一阶拟合情况————
    False
    0.014289167794024626
    ————二阶拟合情况————
    False
    0.0010398929329815821
    ————三阶拟合情况————
    False
    0.0013635194627073393
    ————四阶拟合情况————
    False
    0.00020543080400768976
    在这里插入图片描述

    注意,插值好像只支持内插

    x = np.linspace(-2*np.pi, 2*np.pi, num=100)
    f = lambda x: np.sin(x) + 0.5 * x
    x1 = np.linspace(-2*np.pi, 2*np.pi, num=50)
    plt.plot(x1, f(x1), label='True Line')
    
    tck1 = spi.splrep(x, f(x), k=1)
    tck2 = spi.splrep(x, f(x), k=2)
    x2 = np.linspace(-2*np.pi, -np.pi, num=50, endpoint=False)
    x3 = np.linspace(np.pi, 2*np.pi, num=50, endpoint=False)
    iy1 = spi.splev(x2, tck1)
    iy2 = spi.splev(x3, tck2)
    
    plt.scatter(x2, iy1, color='r', label='First Order')
    plt.scatter(x3, iy2, color='g', label='Second Order')
    plt.title('Interpolation')
    plt.legend()
    

    在这里插入图片描述

    展开全文
  • matlab三次样条插值函数代码三次样条插值 这是一个函数,用于显示插值的工作方式以及如何将MATLAB inperp2('spline')转换为C ++。 关于三次样条的重要说明 当指定样条标记时,MATLAB的interp1假定端点条件不是knot...
  • Spline(三次样条插值)

    万次阅读 多人点赞 2015-09-09 09:59:58
    三次样条插值

    关于三次样条插值,计算方法比较复杂,但是静下心来仔细研究也是可以理解的。

    本文借鉴文章来源:http://www.cnki.com.cn/Article/CJFDTotal-BGZD200611035.htm

    定义:

         简单来说就是给定了一些在区间[a,b]的数据点{x1,x2,x3.....xn},对应函数值{y1,y2,y3.....yn},函数在[xj,xj+1]  (j=1,2,...n-1此处根据你的编译器所定,matlab数组下标从1开始的)上有表达式S(x),且满足下面条件:

    1. S(x)是一个三次多项式,在这里设为

    2. S(xj)=yj                    (2-1)

    3. S(xj-0)=S(xj+0)  (j=2,3....,n-1)这就是保证了在非端点处的其它点连续               (2-2)

    4. S'(xj-0)=S'(xj+0) (j=2,3....,n-1)一阶导数连续                              (3-1)

    5. S''(xj-0)=S''(xj+0) (j=2,3....,n-1)二阶导数连续                              (3-2)

    【注】3 4 5的区间从2开始到n-1是因为两个端点不需要判断是否连续,端点处没连续这一说。

           有一个说法“n个未知数需要n个方程才能确定唯一解”,具体对不对,可以参考线性代数的知识。我们的最终目标是求出每个区间的式(1)或者函数值。 共有n-1个区间,每个区间四个参数aj,bj,cj,dj,那么就总共需要4(n-1)个求未知数。在(2-1)中给出了n个方程,(2-2)(3-1)(3-2)总共给出了3(n-2)个方程,所以依据唯一解方法可知还需要4(n-1)-3(n-2)-n=2个方程。

           对于剩下的两个方程,三次样条插值给出了两个边界约束方程,刚好凑齐两个,并且有三种,可以依照自己的兴趣选择一种便于实现的。

    1. 给定了端点处的一阶导数值:S'(x1)=y1'    S'(xn)=yn'

    2.给定了端点处的二阶导数值:S''(x1)=y1''    S''(xn)=yn''。自然边界条件:y1''=yn''=0

    3.给定了一个周期性条件:如果f(x)是以b-a为周期的函数,在端点处便满足:S'(x1+0)=S'(xn-0),S''(x1+0)=S''(xn-0)

    下面的推导是以边界方程1为例的:

    推导过程:

    (一) 利用二阶导得到一些式子:

          S(x)为每个区间的三次多项式,那么S''(x)就是一次多项式。假设S''(xj)=Mj,S''(xj+1)=Mj+1的值已知,那么:
           
    其中hj=xj+1-xj,然后利用S''(x)求S(x):
     

    (二)依据S(x)得到一些式子

    按照上面的证明可以得到:
    其中:hj=xj+1-xj
    依据S(xj)=yj和S(xj+1)=yj+1得到:
    ——————更新日志2020-6-13————————
    感谢评论区老哥@meng_zhi_xiang ,公式(5)的A下标不是j+1,应该是j
    解得(求解过程就不写了,简单的二元方程组)
                                         (6-1)
              (6-2)
    将Aj和Bj带入S(x)中可以得到S(x)的最终式子:
    原文此处应该是有错误,Aj和Bj都没有xj的式子,但是原文的结果中包含。
     
    这里就得到了S(x)的雏形了,xj、xj+1、hj都是已知的,但是Mj和Mj+1是假设已知的,下面就是求它们了。

    (三)利用一阶导数得到一些式子

    依据式(7)求出一阶导:
    然后为了使在xj处连续平滑,那么在xj处的一阶导必须相等。即要满足S'(xj-0)=s'(xj+0)
    等式坐标表示S(x)在[xj-1,xj]的xj的一阶导值,右边表示[xj,xj+1]的xj一阶导值
    其中利用S(x)的表达式可以得到等式左右两边的值:
     
    由上得到两个式子:
     
    由两式相等整理可得:
    令:
    则μjMj-1+2Mj+(1-μj)Mj+1=dj(j=2,3,...,n-1)

    (四)带入边界条件

      此处选择边界条件1,即
    计算:
    结果写为2M1+M2=β1
     
    结果写为Mn-1+2Mn=βn

    (五)结果

    结合(三)、(四)可以看出所有的n个式子已经齐全:
    包括(三)结尾算得μjMj-1+2Mj+(1-μj)Mj+1=dj(j=2,3,...,n-1)的n-2个式子加上(四)得到的两个式子,刚好n个式子.
    用矩阵表示出这n个式子即为:
    方程中
       
    并且hj=xj+1-xj
    这样便解出了矩阵M,然后带入S(x)的式子即上面算得:
    这样便求得了每一个区间上的S(x)了。
     
    matlab代码:
    SplineThree.m
    <pre name="code" class="plain">function f = SplineThree(x,y,dy1,dyn,x0)
    %x,y为输入的已知点
    %x0为待求插值点的横坐标
    %dy1,dyn为约束条件,是端点处的一阶导数值
    n=length(x);
    for j=1:n-1
        h(j)=x(j+1)-x(j);
    end
    
    %得到式子右边的结果矩阵
    d(1,1)=6*((y(2)-y(1))/h(1)-dy1)/h(1);   %等式(11)的结果矩阵的上端点值
    d(n,1)=6*(dyn-(y(n)-y(n-1))/h(n-1))/h(n-1); %等式(11)的结果矩阵的下端点值
    for i=2:n-1
        u(i)=h(i-1)/(h(i-1)+h(i));
        d(i,1)=6*((y(i+1)-y(i))/h(i)-(y(i)-y(i-1))/h(i-1))/(h(i-1)+h(i));
    end
    
    %得到系数矩阵
    A(1,1)=2;
    A(1,2)=1;
    A(n,n-1)=1;
    A(n,n)=2;
    for i=2:n-1
        A(i,i-1)=u(i);
        A(i,i)=2;
        A(i,i+1)=1-u(i);
    end
    
    %解方程
    M=A\d;
    
    format long
    syms t;
    %得到每个区间的式子
    for i=1:n-1
       a(i)=y(i+1)-M(i+1)*h(i)^2/6-((y(i+1)-y(i))/h(i)-(M(i+1)-M(i))*h(i)/6)*x(i+1);
       b(i)=((y(i+1)-y(i))/h(i)-(M(i+1)-M(i))*h(i)/6)*t;
       c(i)=(t-x(i))^3*M(i+1)/(6*h(i));
       e(i)=(x(i+1)-t)^3*M(i)/(6*h(i));
       f(i)=a(i)+b(i)+c(i)+e(i);
        %f(i)=M(i)*(x(i+1)-t)^3/(6*h(i))+M(i+1)*(t-x(i))^3/(6*h(i))+(y(i)-M(i)*h(i)^2/6)*(x(i+1)-t)/h(i)+(y(i+1)-x(i+1)*h(i)^2/6)*(t-x(i))/h(i);
        % f(i)=((x(j+1)-x)^3)*M(i)/(6*h(i))+((x-x(i))^3)*M(i+1)/(6*h(i))+(y(i)-M(i)*(h(i)^2)/6)*((x(i+1)-x)/h(i))+(y(i+1)-(M(i+1)*(h(i)^2)/6))*((x-x(i))/h(i));
    end
    
    %化简
     f=collect(f);
     f=vpa(f,6);
    
     
    if(nargin==5)
       nn=length(x0);
    for i=1:nn
        for j=1:n-1
            if(x0(i)>=x(j)&x0(i)<=x(j+1))
                 yynum(i)=subs(f(j),'t',x0(i));   %计算插值点的函数值.subs是替换函数,把x0用t替换
            end
        end
    end   
    f=yynum;
    else
        f=collect(f);          %将插值多项式展开
        f=vpa(f,6);            %将插值多项式的系数化成6位精度的小数
    end
    end
    
     
    
     
    SplineThree.m
    <pre name="code" class="plain">% x=[-1.5 0 1 2];
    % y=[0.125 -1 1 9];
    % dy1=0.75;
    % dyn=14;
    % x0=1.5;
    % answer=SplineThree(x,y,dy1,dyn);
    % 
    % X=[-1.5 0 1 2];
    % Y=[0.125 -1 1 9];
    % dY=[0.75 14]
    % m=5;
    % spline3(X,Y,dY,x0,m)
    
    X=0:2*pi;
    Y=sin(X);
    dY=[1,1];
    dy1=1;
    dyn=1;
    xx=0:0.5:6;
    m=5;
    % for i=1:length(xx)
    % spline3(X,Y,dY,xx,m);
    % end
    yy=SplineThree(X,Y,dy1,dyn,xx);
    plot(xx,yy,'r')

    本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注

     
    展开全文
  • MATLAB程序分享三次样条插值法求信号的包络线源程序-MATLAB三次样条插值法 求信号的包络线源程序代码.rar
  • 此代码提供具有第一条线性样条的二次样条插值。 在前两行中,用户必须插入数据点 (x)、(y),然后执行程序。 此代码的输出是向量(Coeff)中的二次方程系数,该系数按[a1; b1; c1; a2; b2; c2 .... ,, an; bn; cn]...
  • 三次样条插值

    2018-05-24 09:19:21
    三次样条插值 三次样条插值 三次样条插值 三次样条插值 三次样条插值
  • 遇到个数值 分析中的问题,给定一些离散点,求插值出的点,比如, 我传入30个给定点的坐标,然后我要100个插值点,并要求得这100个插值点处 的一阶导数,求C/C++代码,最好是QT平台的
  • PAGE PAGE #/ 4 第一边界条件源代码 function y=yt1(x0,y0,f_0,f_n,x) (1) %第一类边界条件下三次样条插值 %xi 所求点 %yi 所求点函数值 %x已知插值点 %y已知插值点函数值 %f_0 左端点一次导数值 %f_n 右端点一次导...
  • 1 三次样条插值 早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线。 设函数S(x)∈C2[a,b] ,且在每个小区间[xj, xj+1]上是三次...

    1 三次样条插值

    早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线。

    设函数S(x)∈C2[a,b] ,且在每个小区间[xj, xj+1]上是三次多项式,其中a=x0<x1<...<xn=b 是给定节点,则称S(x)是节点x0,x1,...xn上的三次样条函数。若在节点xj上给定函数值yj=f(xj) ( j=0,1,...,n) ,并成立S(xj) =yj ( j= 0, 1, , n) ,则称S(x)为三次样条插值函数

    下文分别使用Python和MATLAB实现三次样条插值,待插值的函数如下:

    2 Python三次样条插值

    import numpy as np
    import scipy.interpolate as spi
    import matplotlib.pyplot as plt
    
    #生成[-10,10]内长度为41的序列
    x=np.linspace(-10,10,41)
    y=np.sin(x**3)/np.cos(x**2)
    
    #观测数据点
    ix3=np.linspace(x[0],x[-1],81)
    #三次样条插值
    ipo3=spi.splrep(x,y,k=3) #生成模型参数
    iy3=spi.splev(ix3,ipo3) #生成插值点
    
    plt.plot(x,y)
    plt.plot(ix3,iy3)
    plt.legend(['origin','interp'],loc='upper left')
    plt.show()
    Python运行结果

     

    3 MATLAB三次样条插值

    x=linspace(-10,10,41);
    y=sin(x.^3)./cos(x.^2);
    
    ix3=linspace(x(1),x(length(x)),81);
    iy3=spline(x,y,ix3); %三次样条插值
    
    plot(x,y,'b-','lineWidth',2)
    hold on
    plot(ix3,iy3,'r-','lineWidth',2);
    legend('origin','interp','loc')
    MATLAB运行结果

     

    展开全文
  • 样条插值经典解释

    2013-08-01 09:23:57
    样条插值 样条插值 样条插值 样条插值 样条插值 样条插值
  • 样条插值

    2021-01-26 10:41:51
    样条插值法 在实际的数学建模问题中,高次的样条插值多项式也会产生“龙格现象”,因此,常常使用“三次样条插值”来提高“模拟数据”的准确性。 三次样条插值 三次样条插值法的代码实现: %三次样条插值法 a=0; a...

    样条插值法

    在实际的数学建模问题中,高次的样条插值多项式也会产生“龙格现象”,因此,常常使用“三次样条插值”来提高“模拟数据”的准确性。

    三次样条插值

    在这里插入图片描述

    三次样条插值法的代码实现:

    %三次样条插值法
    
    a=0;
    a=input('请输入数据矩阵的行数:');
    
    b=0;
    b=input('请输入数据矩阵的列数:');
    
    %初始化目标矩阵
    c=zeros(a,b);
    c=input('请依次输入数据矩阵:');
    disp('数据矩阵:');
    disp(c);
    
    %确定插值区间
    d=0;
    d=input('请输入插值区间:');
    
    
    %进行插值
    e(1,:)=d;
    
    [n,m]=size(c);
    
    for i=2:n
        e(i,:)=spline(c(1,:),c(i,:),d);
    end
    
    %目标矩阵
    disp('Hermite插值后的矩阵:');
    disp(e);
    

    n维数据的插值

    在这里插入图片描述

    三次样条插值法的应用

    以“第六届MathorCup全国大学生数学建模挑战赛A题目”中的数据为例子
    数据
    很明显的可以看出,实验数据只给出了“单数周”,缺少“双数周”的实验数据,因此,需要进行“插值”进行“弥补数据的数量”。

    Matlab中的代码实现:

    %第二种方法:三次样条插值
    
    A=[1:15];
    B(1,:)=A;
    
    ylab={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'}; 
    
    for i=2:12
        B(i,:)=spline(h(1,:),h(i,:),B(1,:));
    end
    
    for i=2:12
        subplot(3,4,i-1),
        plot(B(1,:),B(i,:),'r-');
        hold on;
        plot(h(1,:),h(i,:),'o');
        axis([0 15,-inf,inf])
        title(ylab{i-1})
    end
    
    legend('三次样条插值数据','原始数据','Location','SouthEast');
    

    运行结果:

    运行结果

    展开全文
  • 描述了三次样条插值的matlab编程原理及程序。有多种边界条件可供选择。数值计算第二次大作业——验证三次样条函数插值是否有几何不变性' Y0 0.01087 ' Y7 100三次样条函数的构造过程如下:设x1 x2 x3 xn 1 xn共n个...
  • 这是一个三次样条插值插值C源程序,三次样条插值将一系列点用平滑曲线连在一起的算法...
  • 基于样条插值的模糊控制算法,杨文光,赵海良,本文利用三次样条插值函数,直接由控制输入输出数据对建立了控制输入与控制输出之间的映射关系,得到了一元三次样条插值控制算法
  • 已知一组数据点 编写一程序求解三次样 条插值函数 满足 并针对下面一组具体实验数据 0.25 0.3 0.39 0.45 0.53 0.5000 0.5477 0.6245 0.6708 0.7280 求解其中边界条件为 . 解 Matlab 计算程序为 clear clc x=[0.25 ...
  • G3圆锥样条插值的构造
  • 对三次样条插值函数的m文件,下载可直接可用,用于matlab编程设计和课程作用 对三次样条插值函数的m文件,下载可直接可用,用于matlab编程设计和课程作用
  • 关于B-样条插值及紧支撑样条小波插值的一个注记,徐应祥,,本文对B-样条函数插值与紧支撑样条小波函数插值中如何选择基函数做了一些探讨,并指出了选择基函数时应注意的一些问题.
  • 数值分析(二) 三次样条插值法matlab程序

    万次阅读 多人点赞 2020-06-25 01:47:15
    目录前言一、三次样条插值1. 三次样条函数定义2. 三次样条插值多项式3. 三次样条插值求法3.1 第一种类型3.2 第二种类型3.3 第三种类型二、三次样条插值公式matlab程序1. 三次样条插值公式(第二种类型)2 例题三、 ...
  • 数据插值,拉格朗日,牛顿,埃尔米特插值,等距节点插值三次样条插值三次样条插值与拉格朗日的比较
  • 本文实例为大家分享了python实现三次样条插值的具体代码,供大家参考,具体内容如下 函数: 算法分析 三次样条插值。就是在分段插值的一种情况。 要求: 在每个分段区间上是三次多项式(这就是三次样条中的三次的...
  • 三次样条插值函数求解过程
  • 第三样条插值matlab代码比较除法与三次样条的插值 已经在matlab中创建了这个,在python中优化修复matlab代码将python代码转换为jupyter notebooks
  • 三次样条插值代码matlab 样条插值应用:曲线截面近似 客观的 使用自然三次样条和固定三次样条来构造三次插值多项式以绘制曲线的各个部分。 算法 查看在CCSpline.m和NCSpline.m中实现的功能 结果与观察 在运行MATLAB...
  • python样条插值例题.doc

    2021-05-20 23:31:52
    python实现样条插值,并且通过第一类边界条件进行梯度下降算法寻找局部最小曲率。
  • 自己写的实现三次样条插值函数,采用的是第二类边界条件,即已知首尾的一节导数,获得样条插值,同时提供了梯度下降法寻找最优解的样例。
  • 三次样条插值.rar

    2021-02-05 10:05:18
    第一边界条件的3次样条插值函数的通用程序,可以直接调用,参数有说明

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,252
精华内容 900
关键字:

样条插值