gpt4 book ai didi

c# - 使用 Math.Net Numerics 的大 x 值线性插值不正确

转载 作者:太空狗 更新时间:2023-10-30 00:51:57 24 4
gpt4 key购买 nike

我正在尝试使用 Math.NET Numerics 对 DateTime - Value 系列进行插值。我从线性插值开始,但得到了一些非常不好看的结果。

运行这个测试:

public class script{

public void check_numerics()
{
var ticks = DateTime.Now.Ticks;
Console.WriteLine("Ticks: " + ticks);
var xValues = new double[] { ticks, ticks + 1000, ticks + 2000, ticks + 3000, ticks + 4000, ticks + 5000 };
var yValues = new double[] {0, 1, 2, 3, 4, 5};
var spline = Interpolate.LinearBetweenPoints(xValues, yValues);
var ticks2 = ticks;
for (int i = 0; i < 10; i++)
{
ticks2 += 500;
Console.WriteLine(spline.Interpolate(ticks2));
}
}
}

这给出:

Ticks: 635385235576843379
0.5
1
1.5
2
2.42857142857143 // this should be 2.5
3
3.5
4
4.5
5

请注意 2.4285 是相当错误的。在不同的时间(不同的刻度值)不同的值将是“错误的”。 Math.NET 中是否存在 x 值较大的“错误”,或者我期望过高?

最佳答案

只是确认上面作为 Math.NET Numerics 维护者的评论:

可以用 double 表示的这种数量级的最接近数字之间的距离 (epsilon) 是 128:

Precision.EpsilonOf(ticks); // 128

这意味着如果您从这个数字中添加或减去 128/2-1 = 63,您将得到完全相同的数字:

long ticks = DateTime.Now.Ticks // 635385606515570758
((long)(double)ticks) // 635385606515570816
((long)(63+(double)ticks)) // 635385606515570816
((long)(-63+(double)ticks)) // 635385606515570816
((long)(65+(double)ticks)) // 635385606515570944
((long)(-65+(double)ticks)) // 635385606515570688

500 的增量步长非常接近这 128,并且有效地四舍五入到 128 的倍数(例如 512),所以会有一些像这样的伪像也就不足为奇了。

如果按照 James 的建议,通过将刻度除以 10000 来将时间精度降低到毫秒,您将得到 epsilon 为 0.0078125,即使步长为 1 而不是 500,结果也是准确的。

Precision.EpsilonOf(ticks/10000); // 0.0078125

关于c# - 使用 Math.Net Numerics 的大 x 值线性插值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244554/

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