Mam problemy z interpolacją pliku danych, który przekonwertowałem z .csv na tablicę X i tablicę Y, gdzie X [0] odpowiada na przykład Y [0].C# Interpolacja liniowa
Potrzebuję interpolacji między wartościami, aby uzyskać gładki plik na końcu. Używam Picoscope do wyprowadzania funkcji, co oznacza, że każda linia jest równo rozłożona w czasie, więc tylko przy użyciu wartości Y, dlatego próbuję to zrobić w dziwny sposób, gdy widzisz mój kod.
Rodzaj wartości ma do czynienia to:
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
Więc gdzie 2 wartości Y obok siebie są takie same, jest to linia prosta pomiędzy nimi, ale gdy różnią się one niczym od X = 10 na Oddziały stają się falą sinusoidalną w tym przykładzie.
Patrzyłem na równania interpolacji itp. I inne posty tutaj, ale nie robiłem tego rodzaju matematyki od lat i niestety nie mogę tego rozgryźć, ponieważ są 2 niewiadome i mogę nie myśl, jak to zaprogramować na C#.
co mam to:
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++;
}
i tworzy ścisły fali, ale nadal jest bardzo steppy.
Ktoś może zobaczyć, dlaczego nie jest to bardzo dokładne? Jak poprawić dokładność? Albo inny sposób robienia tego za pomocą tablic?
Dzięki za szuka :)
możliwe duplikat [najmniejszych kwadratów bibliotecznych C#] (http://stackoverflow.com/questions/ 350852/co najmniej-kwadrat-c-sharp-biblioteka) –