gpt4 book ai didi

C# 线性插值

转载 作者:太空狗 更新时间:2023-10-29 20:03:16 27 4
gpt4 key购买 nike

我在插入数据文件时遇到问题,例如,我已将其从 .csv 转换为 X 数组和 Y 数组,其中 X[0] 对应于点 Y[0]。

我需要在这些值之间进行插值,以便在最后给我一个平滑的文件。我正在使用 Picoscope 输出函数,这意味着每行在时间上的间隔相等,因此只使用 Y 值,这就是为什么当您看到我的代码时我试图以一种奇怪的方式来执行此操作。

它必须处理的值类型是:

X     Y
0 0
2.5 0
2.5 12000
7.5 12000
7.5 3000
10 3000
10 6000
11 6625.254
12 7095.154

因此,当彼此相邻的 2 个 Y 值相同时,它们之间是一条直线,但是当它们从 X = 10 开始变化时,在这个例子中它变成了正弦波。

我一直在研究插值等的方程式和这里的其他帖子,但我已经很多年没有做过那种数学了,遗憾的是我再也想不出来了,因为有 2 个未知数,我不能'不要考虑如何将其编程到 C# 中。

我有的是:

int a = 0, d = 0, q = 0;
bool up = false;
double times = 0, change = 0, points = 0, pointchange = 0;
double[] newy = new double[8192];
while (a < sizeoffile-1 && d < 8192)
{
Console.Write("...");
if (Y[a] == Y[a+1])//if the 2 values are the same add correct number of lines in to make it last the correct time
{
times = (X[a] - X[a + 1]);//number of repetitions
if ((X[a + 1] - X[a]) > times)//if that was a negative number try the other way around
times = (X[a + 1] - X[a]);//number of repetitions
do
{
newy[d] = Y[a];//add the values to the newy array which replaces y later on in the program
d++;//increment newy position
q++;//reduce number of reps in this loop
}
while (q < times + 1 && d < 8192);
q = 0;//reset reps
}
else if (Y[a] != Y[a + 1])//if the 2 values are not the same interpolate between them
{
change = (Y[a] - Y[a + 1]);//work out difference between the values
up = true;//the waveform is increasing
if ((Y[a + 1] - Y[a]) > change)//if that number was a negative try the other way around
{
change = (Y[a + 1] - Y[a]);//work out difference bwteen values
up = false;//the waveform is decreasing
}
points = (X[a] - X[a + 1]);//work out amount of time between given points
if ((X[a + 1] - X[a]) > points)//if that was a negative try other way around
points = (X[a + 1] - X[a]);///work out amount of time between given points
pointchange = (change / points);//calculate the amount per point in time the value changes by
if (points > 1)//any lower and the values cause errors
{
newy[d] = Y[a];//load first point
d++;
do
{
if (up == true)//
newy[d] = ((newy[d - 1]) + pointchange);
else if (up == false)
newy[d] = ((newy[d - 1]) - pointchange);
d++;
q++;
}
while (q < points + 1 && d < 8192);
q = 0;
}
else if (points != 0 && points > 0)
{
newy[d] = Y[a];//load first point
d++;
}
}
a++;
}

这会创建一个接近的波形,但它仍然非常不稳定。

所以有人能看出为什么这不是很准确吗?如何提高其准确性?或者使用数组的不同方法?

感谢观看:)

最佳答案

为我试试这个方法:

static public double linear(double x, double x0, double x1, double y0, double y1)
{
if ((x1 - x0) == 0)
{
return (y0 + y1) / 2;
}
return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
}

实际上你应该能够像这样获取你的数组并使用它:

var newY = linear(X[0], X[0], X[1], Y[0], Y[1]);

我从 here 中提取了代码, 但验证了该算法符合理论 here ,所以我认为是对的。但是,如果这仍然是阶跃的,您可能应该考虑使用多项式插值,请注意理论链接,它表明线性插值会产生阶梯波。

所以,我给出的第一个链接,也就是我从中获取这段代码的地方,也有一个多项式算法:

static public double lagrange(double x, double[] xd, double[] yd)
{
if (xd.Length != yd.Length)
{
throw new ArgumentException("Arrays must be of equal length."); //$NON-NLS-1$
}
double sum = 0;
for (int i = 0, n = xd.Length; i < n; i++)
{
if (x - xd[i] == 0)
{
return yd[i];
}
double product = yd[i];
for (int j = 0; j < n; j++)
{
if ((i == j) || (xd[i] - xd[j] == 0))
{
continue;
}
product *= (x - xd[i]) / (xd[i] - xd[j]);
}
sum += product;
}
return sum;
}

要使用这个,你将不得不决定你想如何提高你的 x 值,所以假设我们想通过找到当前迭代和下一个:

for (int i = 0; i < X.Length; i++)
{
var newY = lagrange(new double[] { X[i]d, X[i+1]d }.Average(), X, Y);
}

请注意,此循环还有更多内容,例如确保有 i+1 等,但我想看看我是否可以给您一个开始。

关于C# 线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838007/

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