Tengo problemas para interpolar un archivo de datos, que he convertido de .csv en una matriz X y matriz Y donde X [0] corresponde al punto Y [0], por ejemplo.C# Interpolación lineal
Necesito interpolar entre los valores para darme un archivo sin problemas al final. Estoy usando un Picoscope para generar la función, lo que significa que cada línea está equidistantemente espaciada en el tiempo, por lo que solo uso valores Y, por lo que trato de hacer esto de forma extraña cuando ve mi código.
el tipo de valores que tiene que hacer frente son:
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
Así que 2 valores Y junto a la otra son los mismos que es una línea recta entre ellos, pero cuando se varían como desde x = 10 en wards se convierte en una onda sinusoidal en este ejemplo.
He estado buscando las ecuaciones para interpolación, etc. y otras publicaciones aquí, pero hace años que no hago ese tipo de cálculos y, por desgracia, ya no puedo resolverlo, porque hay 2 incógnitas y puedo No pienses cómo programar eso en C#.
Lo que tengo es:
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++;
}
y esto crea una forma de onda de cerca, pero todavía es muy steppy.
Entonces, ¿alguien puede ver por qué esto no es muy preciso? ¿Cómo mejorar su precisión? ¿O una forma diferente de hacer esto usando matrices?
Gracias por mirar :)
posible duplicado de [Mínimos Cuadrados C# biblioteca] (http://stackoverflow.com/questions/ 350852/least-squares-c-sharp-library) –