Matlab中对离散数据点进行B样条曲线拟合

1.拟合出的曲线通过离散的路径点

x= [0;0.0128205128205128;0.0256410256410256;0.0384615384615385;0.0512820512820513;0.0641025641025641;0.0769230769230769;0.0897435897435897;0.102564102564103;0.115384615384615;0.128205128205128;0.141025641025641;0.153846153846154;0.166666666666667;0.179487179487180;0.192307692307692;0.205128205128205;0.217948717948718;0.230769230769231;0.243589743589744;0.256410256410256;0.269230769230769;0.282051282051282;0.294871794871795;0.307692307692308;0.320512820512821;0.333333333333333;0.346153846153846;0.358974358974359;0.371794871794872;0.384615384615385;0.397435897435897;0.410256410256410;0.423076923076923;0.435897435897436;0.448717948717949;0.461538461538462;0.474358974358974;0.487179487179487;0.500000000000000;0.512820512820513;0.525641025641026;0.538461538461538;0.551282051282051;0.564102564102564;0.576923076923077;0.589743589743590;0.602564102564103;0.615384615384615;0.628205128205128;0.641025641025641;0.653846153846154;0.666666666666667;0.679487179487180;0.692307692307692;0.705128205128205;0.717948717948718;0.730769230769231;0.743589743589744;0.756410256410256;0.769230769230769;0.782051282051282;0.794871794871795;0.807692307692308;0.820512820512821;0.833333333333333;0.846153846153846;0.858974358974359;0.871794871794872;0.884615384615385;0.897435897435898;0.910256410256410;0.923076923076923;0.935897435897436;0.948717948717949;0.961538461538462;0.974358974358974;0.987179487179487;1]
y = [0;0;-0.00210988000000000;-0.00115278000000000;-0.000152780000000000;0.00281970000000000;0.00381978000000000;0.00483972000000000;0.00793453000000000;0.0115414000000000;0.0133153000000000;0.0146549000000000;0.0157498000000000;0.0166018000000000;0.0172609000000000;0.0176989000000000;0.0179270000000000;0.0179989000000000;0.0179386000000000;0.0178000000000000;0.0176083000000000;0.0174145000000000;0.0172459000000000;0.0171472000000000;0.0171085000000000;0.0171238000000000;0.0171999000000000;0.0173190000000000;0.0174359000000000;0.0175483000000000;0.0176107000000000;0.0175886000000000;0.0174669000000000;0.0172009000000000;0.0166578000000000;0.0158427000000000;0.0146909000000000;0.0132764000000000;0.0114232000000000;0.00985331000000000;0.00798939000000000;0.00573892000000000;0.00300738000000000;0;-0.00443505000000000;-0.00944156000000000;-0.0155150000000000;-0.0228853000000000;-0.0318467000000000;-0.0427468000000000;-0.0560513000000000;-0.0721688000000000;-0.0913496000000000;-0.113515000000000;-0.137977000000000;-0.162830000000000;-0.185098000000000;-0.201125000000000;-0.207564000000000;-0.203193000000000;-0.189337000000000;-0.169244000000000;-0.146676000000000;-0.123783000000000;-0.102184000000000;-0.0817261000000000;-0.0612605000000000;-0.0395437000000000;-0.0159423000000000;0.00880633000000000;0.0333237000000000;0.0563616000000000;0.0781288000000000;0.101801000000000;0.130293000000000;0.157632000000000;0.171608000000000;0.180132000000000;0.172427000000000]
sp = spapi(3,x,y);
fnplt(sp);

其中:(x,y)为离散的数据点;spapi(3,x,y)表示用3阶B样条曲线对离散的数据点进行拟合,并且要经过给定的离散数据点;fnplt(sp)代表画出该B样条曲线。

结果如下图:
1

2.拟合后的曲线进行了平滑但不一定过数据点

x= [0;0.0128205128205128;0.0256410256410256;0.0384615384615385;0.0512820512820513;0.0641025641025641;0.0769230769230769;0.0897435897435897;0.102564102564103;0.115384615384615;0.128205128205128;0.141025641025641;0.153846153846154;0.166666666666667;0.179487179487180;0.192307692307692;0.205128205128205;0.217948717948718;0.230769230769231;0.243589743589744;0.256410256410256;0.269230769230769;0.282051282051282;0.294871794871795;0.307692307692308;0.320512820512821;0.333333333333333;0.346153846153846;0.358974358974359;0.371794871794872;0.384615384615385;0.397435897435897;0.410256410256410;0.423076923076923;0.435897435897436;0.448717948717949;0.461538461538462;0.474358974358974;0.487179487179487;0.500000000000000;0.512820512820513;0.525641025641026;0.538461538461538;0.551282051282051;0.564102564102564;0.576923076923077;0.589743589743590;0.602564102564103;0.615384615384615;0.628205128205128;0.641025641025641;0.653846153846154;0.666666666666667;0.679487179487180;0.692307692307692;0.705128205128205;0.717948717948718;0.730769230769231;0.743589743589744;0.756410256410256;0.769230769230769;0.782051282051282;0.794871794871795;0.807692307692308;0.820512820512821;0.833333333333333;0.846153846153846;0.858974358974359;0.871794871794872;0.884615384615385;0.897435897435898;0.910256410256410;0.923076923076923;0.935897435897436;0.948717948717949;0.961538461538462;0.974358974358974;0.987179487179487;1]
y = [0;0;-0.00210988000000000;-0.00115278000000000;-0.000152780000000000;0.00281970000000000;0.00381978000000000;0.00483972000000000;0.00793453000000000;0.0115414000000000;0.0133153000000000;0.0146549000000000;0.0157498000000000;0.0166018000000000;0.0172609000000000;0.0176989000000000;0.0179270000000000;0.0179989000000000;0.0179386000000000;0.0178000000000000;0.0176083000000000;0.0174145000000000;0.0172459000000000;0.0171472000000000;0.0171085000000000;0.0171238000000000;0.0171999000000000;0.0173190000000000;0.0174359000000000;0.0175483000000000;0.0176107000000000;0.0175886000000000;0.0174669000000000;0.0172009000000000;0.0166578000000000;0.0158427000000000;0.0146909000000000;0.0132764000000000;0.0114232000000000;0.00985331000000000;0.00798939000000000;0.00573892000000000;0.00300738000000000;0;-0.00443505000000000;-0.00944156000000000;-0.0155150000000000;-0.0228853000000000;-0.0318467000000000;-0.0427468000000000;-0.0560513000000000;-0.0721688000000000;-0.0913496000000000;-0.113515000000000;-0.137977000000000;-0.162830000000000;-0.185098000000000;-0.201125000000000;-0.207564000000000;-0.203193000000000;-0.189337000000000;-0.169244000000000;-0.146676000000000;-0.123783000000000;-0.102184000000000;-0.0817261000000000;-0.0612605000000000;-0.0395437000000000;-0.0159423000000000;0.00880633000000000;0.0333237000000000;0.0563616000000000;0.0781288000000000;0.101801000000000;0.130293000000000;0.157632000000000;0.171608000000000;0.180132000000000;0.172427000000000]
w = ones(size(x)); w([1 end]) = 100;
sp = spaps(x,y, 1.e-2, w, 3);
fnplt(sp);

其中:(x,y)为离散的数据点;spaps(x,y, 1.e-2, w, 3)表示用B样条曲线对离散的数据点进行平滑拟合,不一定经过给定的离散数据点,1.e-2为允许的拟合误差,w向量第一个分量和最后一个分量为100,其余为1,代表拟合后的起点和终点与数据点必须很接近。

结果如下图:
2
从曲线的最低点可看出,其与原数据点存在较大的偏差。

如果将1.e-2改为1.e-5,可得:
3
可以看出,上图更接近于原始的数据点。

附:样条工具箱函数

  1. 三次样条函数
    csapi 插值生成三次样条函数
    csape 生成给定约束条件下的三次样条函数
    csaps 平滑生成三次样条函数
    cscvn 生成一条内插参数的三次样条曲线
    getcurve 动态生成三次样条曲线

  2. 分段多项式样条函数
    ppmak 生成分段多项式样条函数
    ppual 计算在给定点处的分段多项式样条函数值

  3. B样条函数
    spmak 生成B样条函数
    spcrv 生成均匀划分的B样条函数
    spapi 插值生成B样条函数
    spap2 用最小二乘法拟合生成B样条函数
    spaps 对生成的B样条曲线进行光滑处理
    spcol 生成B样条函数的配置矩阵

  4. 有理样条函数
    rpmak 生成有理样条函数
    rsmak 生成有理样条函数

  5. 样条操作函数
    fnval 计算在给定点处的样条函数值
    fmbrk 返回样条函数的某一部分(如断点或系数等)
    fncmb 对样条函数进行算术运算
    fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
    fnder 求样条函数的微分(即求导数)
    fndir 求样条函数的方向导数
    fnint 求样条函数的积分
    fnjmp 在间断点处求函数值
    fnplt 画样条曲线图
    fnrfn 在样条曲线中插入断点。
    fntlr 生成tarylor系数或taylor多项式

  6. 样条曲线端点和节点处理函数
    augknt 在已知节点数组中添加一个或多个节点
    aveknt 求出节点数组元素的平均值
    brk2knt 增加节点数组中节点的重次
    knt2brk 从节点数组中求得节点及其重次
    knt2mlt 从节点数组中求得节点及其重次
    sorted 求出节点数组的元素在另一节点数组中属于第几个分量
    aptknt 求出用于生成样条曲线的节点数组
    newknt 对分段多项式样条函数进行重分布
    optknt 求出用于内插的最优节点数组
    chbpnt 求出用于生成样条曲线的合适节点数组

猜你喜欢

转载自blog.csdn.net/weixin_43795921/article/details/108495272
今日推荐