- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解如何在 Eigen 中使用样条曲线,特别是我想在某个点上找到样条插值及其一阶和二阶导数的值。找到内插值很容易,但是当我尝试计算导数时,我得到了奇怪的值。
我尝试按照手册 ( http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1Spline.html#af3586ab1929959e0161bfe7da40155c6 ) 中关于 derivatives
命令的说明进行操作,这是我在代码中的尝试:
#include <iostream>
#include <Eigen/Core>
#include <unsupported/Eigen/Splines>
using namespace Eigen;
using namespace std;
double scaling(double x, double min, double max) // for scaling numbers
{
return (x - min)/(max - min);
}
VectorXd scale(VectorXd xvals) // for scaling vectors
{
const double min = xvals.minCoeff();
const double max = xvals.maxCoeff();
for (int k = 0; k < xvals.size(); k++)
xvals(k) = scaling(xvals(k),min,max);
return xvals;
}
int main()
{
typedef Spline<double,1,3> spline;
VectorXd xvals = (VectorXd(4) << 0,1,2,4).finished();
VectorXd yvals = xvals.array().square(); // x^2
spline testspline = SplineFitting<spline>::Interpolate(yvals.transpose(), 3,
scale(xvals).transpose());
cout << "derivative at x = 0: " << testspline.derivatives(0.00,2) << endl;
cout << "derivative at x = 1: " << testspline.derivatives(0.25,2) << endl;
cout << "derivative at x = 2: " << testspline.derivatives(0.50,2) << endl;
cout << "derivative at x = 3: " << testspline.derivatives(0.75,2) << endl;
cout << "derivative at x = 4: " << testspline.derivatives(1.00,2) << endl;
}
输出
derivative at x = 0: 0 0 32
derivative at x = 1: 1 8 32
derivative at x = 2: 4 16 32
derivative at x = 3: 9 24 32
derivative at x = 4: 16 32 32
也就是说,插值是正确的(c.f. x = 3),但导数不是,它们以系统的方式关闭,所以我想我做错了什么。由于这些遵循 x^2,导数应为 0,2,4,6,8
,二阶导数应为 2
。
关于如何解决这个问题有什么想法吗?
将 x^2
更改为 x^2 + 1
会产生相同的导数,因此至少可以检查。但是将 x^2
更改为 x^3
是错误的,但错误的方式略有不同,输出将是:
derivative at x = 2: 8 48 192
derivative at x = 3: 27 108 288
derivative at x = 4: 64 192 384
哪个是错误的,应该是 6, 9, 12
。
同时运行 x^2
案例,但将输入 vector 更改为 0,1,...9
会产生与使用原始输入 vector 相同的导数,但是二阶导数变为稳定的 200
,这也是错误的。我不明白为什么二阶导数应该取决于输入点的数量。
最佳答案
解决了。你们非常亲密。您所要做的就是扩展衍生品与
1/(x_max - x_min)
(一阶导数)1/(x_max - x_min)^2
(二阶导数)。TLDR:您在拟合样条曲线时将 x 值标准化为介于 0 和 1 之间,但没有缩放 y 值。
您实际拟合的不是样条拟合 x^2,而是:
x_norm = (x - x_min) / (x_max - x_min)
y = x_norm**2
因此使用链式法则,y = x_norm**2
的一阶导数为 2x/(x_max - x_min)
,二阶导数为 2/(x_max - x_min)**2
。
完整示例代码:
#include <iostream>
#include <Eigen/Core>
#include <unsupported/Eigen/Splines>
using namespace Eigen;
using namespace std;
VectorXd normalize(const VectorXd &x) {
VectorXd x_norm;
x_norm.resize(x.size());
const double min = x.minCoeff();
const double max = x.maxCoeff();
for (int k = 0; k < x.size(); k++) {
x_norm(k) = (x(k) - min)/(max - min);
}
return x_norm;
}
int main() {
typedef Spline<double, 1, 3> Spline1D;
typedef SplineFitting<Spline1D> Spline1DFitting;
const Vector4d x{0, 1, 2, 4};
const Vector4d y = (x.array().square()); // x^2
const auto knots = normalize(x); // Normalize x to be between 0 and 1
const double scale = 1 / (x.maxCoeff() - x.minCoeff());
const double scale_sq = scale * scale;
Spline1D spline = Spline1DFitting::Interpolate(y.transpose(), 3, knots);
cout << "1st deriv at x = 0: " << spline.derivatives(0.00, 1)(1) * scale << endl;
cout << "1st deriv at x = 1: " << spline.derivatives(0.25, 1)(1) * scale << endl;
cout << "1st deriv at x = 2: " << spline.derivatives(0.50, 1)(1) * scale << endl;
cout << "1st deriv at x = 3: " << spline.derivatives(0.75, 1)(1) * scale << endl;
cout << "1st deriv at x = 4: " << spline.derivatives(1.00, 1)(1) * scale << endl;
cout << endl;
/**
* IMPORTANT NOTE: Eigen's spline module is not documented well. Once you fit a spline
* to find the derivative of the fitted spline at any point u [0, 1] you call:
*
* spline.derivatives(u, 1)(1)
* ^ ^ ^
* | | |
* | | +------- Access the result
* | +---------- Derivative order
* +------------- Parameter u [0, 1]
*
* The last bit `(1)` is if the spline is 1D. And value of `1` for the first
* order. `2` for the second order. Do not forget to scale the result.
*
* For higher dimensions, treat the return as a matrix and grab the 1st or
* 2nd column for the first and second derivative.
*/
cout << "2nd deriv at x = 0: " << spline.derivatives(0.00, 2)(2) * scale_sq << endl;
cout << "2nd deriv at x = 1: " << spline.derivatives(0.25, 2)(2) * scale_sq << endl;
cout << "2nd deriv at x = 2: " << spline.derivatives(0.50, 2)(2) * scale_sq << endl;
cout << "2nd deriv at x = 3: " << spline.derivatives(0.75, 2)(2) * scale_sq << endl;
cout << "2nd deriv at x = 4: " << spline.derivatives(1.00, 2)(2) * scale_sq << endl;
return 0;
}
示例输出:
1st deriv at x = 0: 4.52754e-16
1st deriv at x = 1: 2
1st deriv at x = 2: 4
1st deriv at x = 3: 6
1st deriv at x = 4: 8
2nd deriv at x = 0: 2
2nd deriv at x = 1: 2
2nd deriv at x = 2: 2
2nd deriv at x = 3: 2
2nd deriv at x = 4: 2
关于C++ Eigen : spline derivatives() gives strange derivatives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571084/
编译器知道AbstractDemo是一个抽象类,抽象类不能被实例化。 但是当我调用 newInstance() 方法时,为什么它没有给出编译时错误? import java.lang.reflect.
假设我有如下数据类型: data Cell = Cell (Maybe Player) data Board = Board [[Cell]] 现在我想生成一个这样的递归函数: genBoard
当谈到使用 OpenMP 和 TBB 进行共享内存编程时,我是一个初学者。 我正在实现 QuickHull 算法 ( http://en.wikipedia.org/wiki/QuickHull )
我想创建一个随机列表与列表中元素的不同组合。出现在最终列表中的每个元素的计数应该相同。。例如。在这里,我期望所有元素的计数都是10,因为我给了相同的权重。但这并不总是一样的。如何修改代码以使所有元素的
我想创建一个随机列表与列表中元素的不同组合。出现在最终列表中的每个元素的计数应该相同。。例如。在这里,我期望所有元素的计数都是10,因为我给了相同的权重。但这并不总是一样的。如何修改代码以使所有元素的
以下将显示在 Firebug 或 jsconsole.com 中或在其他 Javascript 交互式控制台中: >>> foo = { a : 1, b : 2.2 } Object { a=1,
在 Azure DevOps 管道中的一项任务中,我尝试停止 IIS 服务器。这可以通过在命令提示符中调用命令net stop WAS来实现。手动执行此操作,它会要求确认 手动方式,我只需按 Y EN
在 Azure DevOps 管道中的一项任务中,我尝试停止 IIS 服务器。这可以通过在命令提示符中调用命令net stop WAS来实现。手动执行此操作,它会要求确认 手动方式,我只需按 Y EN
在 R 编码中出现以下错误。 在我的 Brand_X.xlsx 数据集中,我尝试使用 KNN 插补法计算的 NA 值很少,但我得到的结果低于错误。这里有什么问题吗?谢谢! > library(read
在 Android Studio 中,我希望我的每个应用变体都有自己的图标。 我尝试了各种方法,包括此处建议的方法 How to provide different Android app icons
JSFiddle 示例代码:http://jsfiddle.net/SUMPq/8/ 我在容器上有一些文本,代码位于 HTML 的顶部,靠近正文: Heading TAG SOME TEXTSOM
所以我正在实现这个简单的剃须刀支付集成。但它给我一个“没有找到合适的付款方式”的错误。我之前尝试过选择付款选项表,但也没有用。 val razorpay = RazorpayClient("my
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我在玩 elm-css . 大多数事情都按我的预期工作。 但是我无法为 Css.opacity 提供正确的值功能。 这是我尝试过的: Css.opacity 0.5 这给出了错误: Function
请参阅以下代码: UIImage *image; NSString *str = [[[Data getInstance]arrPic]objectAtIndex:rowIndex]; NSLog(s
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在测试一个用于修改文件的工具,在此过程中一个相当重要的功能是告诉文件大小,尤其是当文件仍然打开时。 $file = tempnam('/tmp', 'test_'); file_put_conte
我是Java/Maven新手,我正在尝试构建一个maven Spring Boot项目,它很早就可以工作并且也成功创建了jar包。但它突然停止工作并开始出现 Maven 编译错误。 我知道它与 pom
我正在尝试让我的 pom.xml 在我的 JAXB 对象上生成 hashCode() 和 equals method()。 4.0.0 0.0.1-SNAPSHOT jar
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我是一名优秀的程序员,十分优秀!