在C/C++中是否有一种简单的方法来计算具有以下特征的"平滑"函数?

st-*_*t-h 5 c++ math interpolation graph function

首先指定一些内容:用户应该能够通过在2D字段上指定3到5个点来创建图形.第一个和最后一个点总是在该字段的边界(它们的位置可能只在y方向上改变 - 而不是x).在这些位置处的图的推导应该是0.可以自由地指定第3点和后续点的位置.应插入一个图表,该图表遍历所有点.但是,此图表应尽可能平滑和平坦.(请为在数学上不正确而道歉)

重要的是:我需要在之后对该图的值进行采样并将其应用于离散信号.第二件事:在x轴的范围内,函数的值不应超过y轴上的边界.在我的图片中,y轴为0和1.我创建了一些图片来说明我在谈论使用3分的内容.

我有些想法:

  1. 使用(立方?)样条:可以应用它们的特征来形成这样的曲线而没有太多问题.但是,据我所知,它们与全局x轴无关.它们通过通常称为(s)的参数与下一个点相关地指定.因此,很难对与x轴相关的图的值进行采样.当我错的时候请纠正我.
  2. 创建一个矩阵,其中包含这些点上的点和推导,并使用LU分解或等效的方法求解该矩阵.

到目前为止,我还没有深入了解这些技术,所以我可能会错过一些我还不知道的优秀技术或算法.

还有一件事情,那就是能够做到的事情:能够通过改变一个或几个参数来调整曲线的陡度.我通过在我的一些照片中使用红色和黑色图表来说明这一点.任何想法或提示如何有效地解决这个问题?

替代文字 替代文字 替代文字替代文字

dmc*_*kee 5

你了解样条是如何到达的吗?

做样条曲线的总结

您可以根据控制点(在控制点处拆分或在它们之间放置断点)将范围分解为多个部分,并将一些参数化函数放入每个子范围,然后通过控制点约束函数,人为引入端点约束和段间约束.

如果您已经计算了自由度和约束条件,那么您将得到一个可解的方程组,它可以根据控制点告诉您正确的参数.

结果是分段函数的一组参数.通常是分段连续和可微分的函数,因为否则将是重点.

在这种情况下如何使用它

因此,考虑将每个内部点作为一个段的中心,该段将被类似峰值的函数(可能是线性背景上的高斯函数)占据,并使用端点作为约束.

对于n总分,D*(n-2)如果每个分段都有参数,则您有D参数.你有四个端点约束f(start)=y_0,f(end)=y_n,f'(start) = f'(end) = 0),和一些集合的段之间的匹配约束:

f_n(between n and n+1) = f_n+1(between n and n+1)
f'_n(between n and n+1) = f'_n+1(between n and n+1)
...
Run Code Online (Sandbox Code Playgroud)

加上每个段由它的控制点关系的约束(通常是f(point n) = y_nf'(point n) = 0或两个(但你来决定).

您可以拥有多少匹配约束取决于自由度的数量(约束总数必须等于DoF的总数,对吧?).您必须在表单中引入一些额外的端点约束f''(start) = 0...才能使其正确.

那时你只是看着很多繁琐的代数来获得如何将它转化为一个大的线性方程组,你可以用矩阵求逆来解决它.

大多数数字方法书都会涵盖这些内容.