精华内容
下载资源
问答
  • 三次均匀B样条插值计算 matlab

    热门讨论 2011-06-16 21:30:34
    三次均匀B样条插值计算 三次均匀B样条插值计算 三次均匀B样条插值计算 三次均匀B样条插值计算
  • 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运行结果

     

    展开全文
  • B样条插值matlab程序

    热门讨论 2009-03-19 19:05:15
    B样条插值的现成matlab程序,3次均匀B样条插值函数
  • 如题,在研究基于b样条的图像插值方法,查了很久没找到双三次b样条插值的代码,偏偏很多论文里用到的就是双三次b样条插值。自我理解双三次b样条插值就是用b样条基函数的双三次插值,但b样条基函数又有很多不一样的,...
  • b样条插值matlab代码本贝尔 目录 1.简介 Bembel是用C ++编写的基于边界元方法的工程库,用于解决等几何框架内由拉普拉斯,亥姆霍兹或电波方程控制的边值问题[3,4,5,6]。 它是TU Darmstadt和巴塞尔大学之间合作的一...
  • PAGE / NUMPAGES 非常类似前面的三弯矩法,这里的sanzhj函数和intersanzhj作用相当于前面的sanwanj和intersanwj,追赶法程序通用,代码如下 % function [newu,w,newv,d]=sanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值 % ...
  • matlab三次样条插值函数代码何明轩的数值算法 描述: 我是格林内尔学院的数学和经济学双主修。 目前(2020年秋季学期2),我正在学习MAT-317数值分析,这是一门高级应用数学课程。 在整个课程中,我将定期在Python中...
  • matlab实现三次样条插值代码 Course-materials Course-materials是数值分析内容的代码实现 python_Cubic_spline_interpolation三次样条插值 Aitken_equation用Aitken加速迭代解非线性方程组 MATLAB_equation用MATB解...
  • MATLAB代码实现三次样条插值

    千次阅读 2020-04-06 20:17:40
    参照《数值分析 第五版(李庆扬)》P42 2.6.2样条插值函数的建立 目的是可以通过读取文本文件中提前存储坐标点,来实现三边界种类型的三次样条插值 F.m function result = F(newton, a, b)%1阶差商求值 result = ...

    参照《数值分析 第五版(李庆扬)》P42 2.6.2样条插值函数的建立
    目的是可以通过读取文本文件中提前存储的坐标点,来实现三边界种类型的三次样条插值

    F.m

    function result = F(newton, a, b)%1阶差商求值
        result = (newton(b, 2) - newton(a, 2)) / (newton(b, 1) - newton(a, 1));
    end
    

    S.m

    function s = S(h, M1, M2, x1, x2, y1, y2, x)%M1, M2 = Mj, Mj+1; X1, X2 = Xj, Xj+1; H = Hj: Y1, Y2 = Yj, Yj+1; 
        s = M1 * (x2 - x).^3 ./ (6 * h) + M2 * (x - x1).^3 ./ (6 * h) + (y1 - M1 * h^2 / 6) .* (x2 - x) ./ h...
            + (y2 - M2 * h^2 / 6) .* (x - x1) ./h;
        s = s .* (heaviside(x - x1) - heaviside(x - x2));
    end
    
    

    spline.m这个是主函数

    % 读取文本文件中存储的横纵坐标,txt的格式为:
    % x1    y1
    % x2    y2
    % ... 
    % xn    yn
    % xn+1  yn+1
    %横纵坐标用Tab隔开
    FileData = load('data.txt');
    X = FileData(:,1);
    Y = FileData(:,2);
    NewTon = [X, Y];
    PointNumber = length(X); %n + 1 个点
    n = PointNumber-1;
    X_min = min(X);
    X_max = max(X);
    Y_min = min(Y);
    Y_max = max(Y);
    kind = input("请输入边界条件类型:1(已知两端的一阶导数值),2(已知两端二阶导数值)或3(f(x)是以Xn-X0为周期的周期函数))\n");
    if(kind ==3 && abs(Y(1) - Y(n+1)) >= 1e-5)
        disp("两端函数值不一致,错误!");
        return;
    end
    h = [0];
    u = [0];
    Lamda = [0];
    d = [0];
    
    %求hi
    for i = 0:n - 1
        h(i+1) = X(i+2) - X(i+1);%h参数加了1 
    end
    %求ui 和 Lamdai
    for j = 1:n - 1
        u(j) = h(j) / (h(j) + h(j+1));%h参数加了1 
        Lamda(j) = h(j+1) / (h(j) + h(j+1));%h参数加了1 
    end
    %求di
    for j = 1:n - 1
        d(j) = 6 * (F(NewTon, j+1, j+2) - F(NewTon, j, j+1)) / (h(j) + h(j+1));%h参数加了1
    end
    
    %%%%%%%%%% 第一、二种情况
    if(kind == 1 || kind == 2)
        if(kind == 1)
            f0D1 = input("请输入f(x0)一阶导数值\n");%3;%f(x0)一阶导数
            fnD1 = input("请输入f(xn)一阶导数值\n");%-4;%f(xn)一阶导数
            Lamda0 = 1;
            d0 = (6 / h(0+1)) * (F(NewTon, 0+1, 1+1) - f0D1);
            un = 1;
            dn = (6 / h(n-1+1)) * (fnD1 - F(NewTon, n-1+1, n+1));
        else%第二种情况
            f0D2 = input("请输入f(x0)二阶导数值\n");%3;%f(x0)一阶导数
            fnD2 = input("请输入f(xn)二阶导数值\n");%-4;%f(xn)一阶导数
            Lamda0 = 0;
            d0 = 2 * f0D2;
            un = 0;
            dn = 2 * fnD2;
        end
        %生成系数矩阵A
        A = 2 .* eye(n+1, n+1);%生成元素是2的对角阵
        for j = 2 : n
            A(j, j+1) = Lamda(j-1);
        end
        for j = 1:n - 1
            A(j+1, j) = u(j);
        end
        A(1, 2) = Lamda0;
        A(n+1, n) = un;
        %生成常数列向量b
        b = [d0, d, dn]';
        %求解矩阵方程
        M=A \ b;
        x = X_min - 10 : 0.001 : X_max + 10;
        %画出坐标点
        plot(X,Y,'x');
        hold on;
        Sx = 0;
        %构建插值多项式
        for j = 1:n
            Sx = Sx + S(h(j), M(j), M(j+1), X(j), X(j+1), Y(j), Y(j+1), x);%function s = S(h, M1, M2, x1, x2, y1, y2, x);
        end
        plot(x,Sx);
        title(['三次样条插值 边界条件类型:',num2str(kind)]);
        axis([X_min-0.1*(X_max-X_min) X_max+0.1*(X_max-X_min) Y_min-0.1*(X_max-X_min) Y_max+0.1*(X_max-X_min)]);
        grid on;
        legend("坐标点","插值函数");
    end
    %%%%%%%%%% 第三种情况
    if(kind == 3)
        Lamdan = h(1) / (h(n) + h(1));
        un = 1 - Lamdan;
        dn = 6 * (F(NewTon, 1, 2) - F(NewTon, n, n+1)) / (h(1) + h(n));
        %生成系数矩阵A
        A = 2 .* eye(n, n);%生成元素是2的对角阵
        for j = 1:n-1
            A(j, j+1) = Lamda(j);
        end
        for j = 1:n-2
            A(j+1, j) = u(j+1);
        end
        A(1, n) = u(1);
        A(n, 1) = Lamdan;
        A(n, n-1) = un;
         %生成常数列向量b
        b = [d, dn]';
         %求解矩阵方程
        M = A \ b;
        M = [M(1), M']';
        x = X_min - 10 : 0.001 : X_max + 10;
        %画出坐标点
        plot(X,Y,'x');
        hold on;
        Sx = 0;
        %构建插值多项式
        for j = 1:n
            Sx = Sx + S(h(j), M(j), M(j+1), X(j), X(j+1), Y(j), Y(j+1), x);%function s = S(h, M1, M2, x1, x2, y1, y2, x);
        end
        plot(x,Sx);
        title(['三次样条插值 边界条件类型:',num2str(kind)]);
        axis([X_min-0.1*(X_max-X_min) X_max+0.1*(X_max-X_min) Y_min-0.1*(X_max-X_min) Y_max+0.1*(X_max-X_min)]);
        grid on;
        legend("坐标点","插值函数");
    end
    

    第三种边界类型测试:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    在这里插入图片描述
    第二种边界类型测试:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • b样条插值matlab代码 Master branch Develop branch 碎片 SPLINTER(SPLine INTERpolation)是用于使用样条线进行多元函数逼近的库。 该库可用于函数逼近,回归,数据平滑,数据约简等。 张量积B样条的快速C ++实现...
  • b样条插值matlab代码基础矩阵 该库的某些部分受到Paul Fackler和Mario Miranda的启发。 最初的Matlab代码是随出版物一起编写的 米兰达(Miranda),马里奥(Mario J.)和保罗·法克勒(Paul L.Fackler)。 应用计算...
  • matlab三次样条插值函数代码毫米码 为Elmer生成Fortran代码,以便可以使用我们的材料模型。 技术细节记录在代码注释中。 在Python 3.4中测试。 入门 文件的作用如下: :顶级程序。 从这里开始。 具有仅运行stage1或...
  • matlab三次样条插值函数代码数值微积分八度脚本 与UNIFE(费拉拉大学)的“ Calcolo Numerico e Laboratorio”课程相关的Octave / Matlab函数和脚本,2015-2016年。 这个仓库是关于什么的 该存储库是可以自由使用的...
  • 在许多问题中通常根据实验观测或经验得到的函数表或离散点上的信息 去研究分析函数的有关特性其中插值法是一种最基本的方法以下给出最基本 的插值问题一一三次样条插值的基本提法 对插值区间a,b进行划分a x0 x1 xn b...
  • matlab三次样条插值函数代码CREx_SlopeTool 一组脚本,允许用户交互地选择大平均值(GA)erp(所有主题的平均值)内的时间范围(ROI),并提取时间窗口内的峰值和最小值,并计算最小值至峰值斜率。 可以在GA-ERP图上...
  • - PAGE PAGE 3 欢迎下载 三次样条插值多项式 计算物理实验作业四 陈万 物理学2013级 13020011006 主程序 clear,clc; format rat x = [1,4,9,16,25,36,49,64]; y = [1,2,3,4,5,6,7,8]; f1 = 0.5; fn = 1/16; [a,b,c,d...
  • 稍后在分割边缘时用于 b 样条插值。 3D 线或边上的切线未定义并且可以沿线旋转,因此(虚拟)相对顶点用于固定切线并使其更像表面法线。 B 样条使用边缘点的速度和切线在所有现有顶点之间插入中间顶点。 拆分后,新...
  • matlab三次样例条码值编程代码我最初编译这些说明是为了自己使用,以便在需要时快速访问MATLAB概念和代码。 这些注释更适合于已经介绍过这些概念的人们,因为其中有一些简短的介绍。 有关更多详细信息,我建议阅读...
  • 一维插值基于分段 g(x)=a+b*x+c*x^2+d*x^3 函数,其中节点保持两次连续可微。 这保证了插值是平滑的。 实现了不同的端结条件。 插值的深度是可变的,并且可以设置为取决于绝对或相对误差容限。 这意味着很容易插入...
  • matlab做深度学习会继续更新,这里最近看这个,所有写了这个: 关于理论部分可以看这篇文章,https://blog.csdn.net/adamshan/article/details/80696881, 1.3 算法总结 假定有n+1个数据节点 a. 计算步长 (i =...

    matlab做深度学习会继续更新,这里最近看这个,所有写了这个:

    关于理论部分可以看这篇文章,https://blog.csdn.net/adamshan/article/details/80696881

    1.3 算法总结

    假定有n+1个数据节点

    image

    a. 计算步长image (i = 0, 1, …, n-1)

    b. 将数据节点和指定的首位端点条件带入矩阵方程

    c. 解矩阵方程,求得二次微分值image。该矩阵为三对角矩阵,具体求法参见我的上篇文章:三对角矩阵的求解

    d. 计算样条曲线的系数:

    image

    其中i = 0, 1, …, n-1

    e. 在每个子区间image 中,创建方程

    image

    matlab程序,这里function程序是计算a、b、c、d:

    function [a,b,c,d]=cubic(x,y)
    %{
    这段程序主要是求三次样条插值的系数 y=ax^3+bx^2+cx+d
    作者:Robert.Cao
     %}
    nx=length(x);  %计算x长度
    h=diff(x);  %计算x之间的差
    a=y;   %系数a
    A=zeros(7,7);
    A=[1,1];
    for i=2:nx
        if i~=nx
             A(i,i)= 2.0 * (h(i-1) + h(i));
        end
        A(i, i-1)= h(i-1);
        A(i-1, i)= h(i-1);
        A(1,2) = 0.0;
        A(nx,nx - 1)= 0.0;
        A(nx, nx)= 1.0;
    end

    B=zeros(7,1);
    for i=2:nx-1
        B(i,1)=6.0 * (a(i + 1) - a(i)) / h(i) - 6.0 * (a(i) -a(i-1)) / h(i-1);
    end
    m=inv(A)*B;   %解方程组求m
    c=m/2.0;  %系数c
        
    for i=1:nx-1
        d(i)=(c(i + 1) - c(i)) / (3.0 * h(i));  %计算系数d
        b(i) = (a(i + 1) - a(i)) / h(i) - h(i) * (c(i + 1) + 2.0 * c(i)) / 3.0;%系数b
    end
     

    主函数程序:

     

    x = [-4., -2, 0.0, 2, 4, 6, 10];
    y = [1.2, 0.6, 0.0, 1.5, 3.8, 5.0, 3.0];
    [a,b,c,d]=cubic(x,y);


    mx=-4:0.01:10;

    L=length(mx);
    for i=1:L
        rx=mx(i);
        if rx==10
            rx=rx-0.01;
        else
            rx=rx;
        end
        rx=floor(rx);
        if mod(rx,2)==0
            rx=rx;
        else
            rx=rx-1;
        end
        if rx==8
            rx=rx-2;
        else
            rx=rx;
        end
        
        low = 0; 
        high = length(x); 
        while(low <= high)
            mid = (low + high)/2;
            mid=ceil(mid)
            midval = x(mid);
            if midval < rx
                low = mid + 1; 
            elseif midval > rx
                high = mid - 1; 
            else
               nx(i)=mid;
               break;
            end
        end
    end

    for i=1:L
    dx(i)=mx(i)-x(nx(i));
     ry(i) = a(nx(i))+ b(nx(i)) * dx(i)+ c(nx(i))* dx(i) ^ 2.0 +d(nx(i)) * dx(i)^3.0;
    end
    figure
    plot(x,y)
    hold on
    plot(mx,ry,'-r')
    这里查找用了二分法查找。

    仿真结果如下:

    从图中可以看出拟合的结果。

     

    展开全文
  • 最近在做数分大作业,因为对matlab不太熟悉,尝试用python来解大作业。 首先,上题: 捕捞机器人轨迹规划 如下图3所示,水面捕捞机器人以船体的形式在水面上自动行驶,通过摄像机拍摄照片获得水面上漂浮物的坐标...

    最近在做数分大作业,因为对matlab不太熟悉,尝试用python来解大作业。

    首先,上题:

    捕捞机器人轨迹规划

    如下图3所示,水面捕捞机器人以船体的形式在水面上自动行驶,通过摄像机拍摄照片获得水面上漂浮物的坐标,驱动船体前进至所需位置捕捞。摄像机获取的信息为水面上每个区域的中心点(图(b)),由于摄像处理信息有延迟,且机器人船体行进过某区域时不便再次转向获取某水面信息,需要对行驶轨迹提前进行规划,以成功捕捞漂浮物。图(c)表示采用单目标识别的方法获得图片上物体的位坐标。                              

    图3 捕捞机器人作业模型图

     

    在获得各个坐标后,希望通过插值获得近处的轨道曲线规划,获得船体的行进路线,要求轨迹拐点应充分考虑船的转弯半径,即曲率不可过小,同时因远端信息采集与轨迹规划会再次进行,故近处轨迹规划的误差精度要求不高。假设某时刻摄像机识别已经获得如下表所示位置信息 

    表2 摄像机识别位置信息

    x坐标(cm)

    45

    75

    105

    135

    165

    225

    255

    y坐标(cm)

    20

    60

    60

    20

    -60

    -100

    20

    这道题全班就我们一个组选了,当时因为考虑到这是一道和控制有关的路径规划题,所以就想尝试一下。

    说说我的思路吧,题目可以理解成一个船要经过一系列给定的点,路径就是我们需要给出的一个插值函数。同时这个插值函数要满足尽量光滑,曲率尽可能的小。

    那么就是需要给出一个最小曲率的插值方案。船类比为车,可以将船类比为车的运行轨迹,这让我想到了列车导轨的缓和曲线设计,常用的缓和曲线如下图所示:

    以及相应的缓和曲线特征: 

    参考我国的缓和曲线,采用的是三次抛物线,很自然的我又联想到了课内学习的三次样条插值。由于样条插值具有一阶导连续、二阶导连续的优良性质,根据曲率的运算公式:

    我们可以知道,样条插值的曲率同样也是连续的,对于路径规划而言无疑是十分友好的。并且薄板样条插值是平面插值中曲率最小的拟合(虽然不知道子在平面坐标系中曲率是否有此类插值方法)。

    所以整题的核心就是如何建立一个样条插值,使得插值函数的最大曲率最小

    以下为三次样条插值的定义:

    由于三次样条插值是利用函数值连续、一阶导连续、二阶导连续构造的函数

    我们要找出4n个方程来求解4n个未知数

    首先,由于所有点必须满足插值条件,

    ,除了两个端点,所有n-1个内部点的每个点都满足:

    前后两个分段三次方程,则有2(n-1)个方程,再加上两个端点分别满足第一个和最后一个三次方程,则总共有2n个方程;

    其次,n-1个内部点的一阶导数应该是连续的,即在第 i 区间的末点和第 i+1 区间的起点是同一个点,它们的一阶导数应该也相等,即 

    则有n-1个方程

    另外,内部点的二阶导数也要连续,即 

    ,也有n-1个方程

    现在总共有4n-2个方程了,还差两个方程就可以解出所有未知数了,这两个方程我们通过边界条件得到。

    而边界条件我采用第一类边界条件,及给定初始、末尾一阶导数的值来求插值函数。

    接下来就是python的代码实现,具体代码实现请看下篇。

    展开全文
  • 三次样条插值matlabt程序: _0 {& i) ^* K, b- i: tfunction x=followup(a,b,c,d)n=length(d);* i0 s$ G& t6 T$ ?8 a7 ma(1)=0;7 Q8 c5 R. `/ N# b%“追”的过程( d$ ^7 g7 F" W% j) |( T2 ?0 Y) e; XL(1)=...
  • B 样条是连续信号的自然信号表示,其中许多连续域操作可以在一次B样条近似已经完成。 此工具箱中使用全极点滤波器的 B 样条估计程序基于 M. Unser 等人的经典论文 [1,2,3],它允许当采样网格为制服。 求值/插值也是...
  • Lagrange插值 Hermite插值 Runge现象和分段插值 分段插值 样条插值MATLAB表示 多项式拟合 函数线性组合的曲线拟合方法 最小二乘曲线拟合 B样条函数及其MATLAB表示
  • 计算三次样条的 H 无穷大最优因果滤波器(间接 B 样条滤波器)。 [输入] d:延迟 [输出] psi:TF 对象中的... Yamamoto, 因果样条插值的 H 无穷大最优逼近, 信号处理,卷。 91,第 2 期,第 176-184 页,2011 年。
  • matlab样条工具箱手册

    2009-01-12 11:12:21
    详细介绍了matlab样条工具箱的使用,包括插值、拟合等,对spline和b-spline的讲解也很详细
  • 开发了使用归一化 B 样条实现非参数概率函数估计的 MATLAB 工具箱“bsspdfest”。 该工具箱使用用于一维数据的 B 样条系列和用于多维数据的张量积 B 样条系列为一维或多维实现非参数概率函数估计程序。 该工具箱利用...
  • Matlab三次均匀B样条曲线插值函数

    热门讨论 2014-03-25 11:25:23
    对给定的点进行三次B样条插值,得到插值曲线,这里给定的点可以是二维平面上的点或三维点,注意输入的点矩阵要每行为一个点坐标,里面都有注释,可以自己简单修改封装成自己想要的带参函数,里面有测试的点数据,...
  • 噪声数据的直接样条插值可能会导致曲线不需要的振荡。 如果斜率曲线很重要。 更好的方法是减少样条的自由度并使用最小二乘法将样条拟合到噪声中数据。 自由度与休息次数有关(结),因此平滑效果由选择休息。 样条...
  • ThrSample1 求已知数据点的第一类三次样条插值多项式及其插值点处的值 ThrSample2 求已知数据点的第二类三次样条插值多项式及其插值点处的值 ThrSample3 求已知数据点的第三类三次样条插值多项式及其插值点处的值 B...

空空如也

空空如也

1 2 3 4
收藏数 69
精华内容 27
关键字:

matlabb样条插值

matlab 订阅