gpt4 book ai didi

c++ - 特征样条插值 - 如何在任意点 x 处获得样条 y 值?

转载 作者:行者123 更新时间:2023-12-03 10:13:22 44 4
gpt4 key购买 nike

我正在尝试使用 Eigen 库来创建样条线。但是,一旦我创建了样条曲线,我不知道如何获得给定点 x 的值。

请参阅下面的示例,说明我的意图:

#include <Eigen/Core>
#include <unsupported/Eigen/Splines>

int main(int argc, char const* argv[])
{
// points at (0,0) (15,12) and (30,17)
Eigen::MatrixXd points(2, 3);
points << 0, 15, 30,
0, 12, 17;

typedef Eigen::Spline<double, 2> spline2d;
spline2d s = Eigen::SplineFitting<spline2d>::Interpolate(points, 2);

// I now have a spline called s.
// I want to do something like:
double x = 12.34;
double new_y = s(x)[1]; // However this s() function uses a chord value. What is a chord value?

// Is there a:
double new_y2 = s.eval(x)
}

最佳答案

我知道这可能会令人困惑。当您使用 Eigen Spline 拟合模块时,它不会对函数 R -> R 建模。例如,您可以用它构建一个螺旋。这意味着您不能期望从 X 值中获得 Y 值,而是根据样条曲线上的点(因此弦长)来挑选样条曲线上的点。

可以使用该模块对函数进行建模,尽管不是非常直观:考虑 R1 中的 Y 值点,而不是让 Eigen 计算弦长,而是提供您自己的一组节点参数,这些节点参数的间距与您的 X 值一样(缩小到 [0,1] 以便算法可以应付)。它可以像这样打包:

#include <Eigen/Core>
#include <unsupported/Eigen/Splines>

#include <iostream>

class SplineFunction {
public:
SplineFunction(Eigen::VectorXd const &x_vec,
Eigen::VectorXd const &y_vec)
: x_min(x_vec.minCoeff()),
x_max(x_vec.maxCoeff()),
// Spline fitting here. X values are scaled down to [0, 1] for this.
spline_(Eigen::SplineFitting<Eigen::Spline<double, 1>>::Interpolate(
y_vec.transpose(),
// No more than cubic spline, but accept short vectors.

std::min<int>(x_vec.rows() - 1, 3),
scaled_values(x_vec)))
{ }

double operator()(double x) const {
// x values need to be scaled down in extraction as well.
return spline_(scaled_value(x))(0);
}

private:
// Helpers to scale X values down to [0, 1]
double scaled_value(double x) const {
return (x - x_min) / (x_max - x_min);
}

Eigen::RowVectorXd scaled_values(Eigen::VectorXd const &x_vec) const {
return x_vec.unaryExpr([this](double x) { return scaled_value(x); }).transpose();
}

double x_min;
double x_max;

// Spline of one-dimensional "points."
Eigen::Spline<double, 1> spline_;
};

int main(int argc, char const* argv[])
{
Eigen::VectorXd xvals(3);
Eigen::VectorXd yvals(xvals.rows());

xvals << 0, 15, 30;
yvals << 0, 12, 17;

SplineFunction s(xvals, yvals);

std::cout << s(12.34) << std::endl;
}

关于c++ - 特征样条插值 - 如何在任意点 x 处获得样条 y 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29822041/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com