如何用matlab得到nurbs拟合曲线的纵坐标

f=spapi(5,t,y);
其中t和y都是一维数组,且都由随机数构成,经过5次样条插值后得到曲线f,我想要得到曲线f的纵坐标,请问应该怎么做呢?

该回答引用ChatGPT

在 MATLAB 中,可以使用 fnval 函数来求解 NURBS 曲线的纵坐标。fnval 函数用于求解插值函数在某个点处的值,其输入参数包括插值函数对象和需要求解的点的横坐标。因此,我们可以将 NURBS 曲线的横坐标作为输入,求解对应的纵坐标。

以下是一个示例代码,展示如何使用 fnval 函数求解 NURBS 曲线的纵坐标:


% 生成一些随机数据
t = linspace(0, 1, 20);
y = rand(size(t));

% 进行 5 次样条插值
f = spapi(5, t, y);

% 生成一些测试数据
t_test = linspace(0, 1, 100);

% 求解 NURBS 曲线在测试数据点处的纵坐标
y_test = fnval(f, t_test);

% 绘制 NURBS 曲线
plot(t, y, 'o', t_test, y_test);

在上面的代码中,我们首先生成一些随机数据,并使用 spapi 函数进行 5 次样条插值,得到 NURBS 曲线对象 f。接下来,我们生成一些测试数据 t_test,并使用 fnval 函数求解 NURBS 曲线在测试数据点处的纵坐标。最后,我们使用 plot 函数绘制 NURBS 曲线。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/166814
  • 除此之外, 这篇博客: 通过给定一组数据点并反求控制点的NURBS曲线插值生成Matlab编程实例中的 1.NURBS曲线方程 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    NURBS曲线方程的表达式,有理分式表达:
    Alt
    式中:
    在这里插入图片描述
    其中,wiw_iwi (iii=0,1,…,n)称为权或者权因子,分别与控制顶点di(i=0,1,.....,n)d_i(i=0,1,.....,n)di(i=0,1,.....,n)相对应。首末权因子 w0w_0w0wn>0w_n > 0wn>0,其余wi≥0w_i \ge 0wi0 ,并且连续kkk个权因子不能同时为零。顺序连接did_idi形成控制多边形。Ni,k(u){N}_{i,k}(u)Ni,k(u)是由节点矢量U=[u0,u1,…,un+k+1]U=[u_0,u_1,\ldots,u_{n+k+1}]U=[u0,u1,,un+k+1] 计算确定的kkk次规范 B 样条基函数,iii表示序号,kkk是样条阶数,k=3k=3k=3,即是三次曲线,。对于NURBS 曲线首尾数据点不相连的,也就是开曲线,通常取两端节点的重复度为r=k+1r=k +1r=k+1,即u0=u1=…=uku_0=u_{1}=\ldots =u_ku0=u1==ukun+1=un+2=…=un+k+1u_{n+1}=u_{n+2}=\ldots =u_{n+k+1}un+1=un+2==un+k+1 。在很多实际应用中,端节点值常取0、1,故NURBS 曲线的定义域可表示为u∈[uk,un+1]⊂[0,1]u\in[u_k,u_{n+1}]\subset [0,1]u[uk,un+1][0,1] 。由此可得,当n=kn = kn=k时,kkk次NURBS 曲线即退化为kkk次有理Bézier 曲线,其节点矢量与同次有理Bézier 曲线的端点具有相同的几何性质。若首末权因子均不为零,即子w1,wn>0w_1,w_n > 0w1wn>0,则曲线首末端点分别与控制多边形首末顶点重合,同时曲线在该点处与控制多边形首末边相切。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^