Interpolacja liniowa C #

Mam problemy interpolujące plik danych, które konwertowałem z .csv na tablicę X i tablicę Y, gdzie X [0] odpowiada na przykład punktowi Y [0].

Muszę interpolować między wartościami, aby dać mi gładki plik na końcu. Używam Picoskopu do wyprowadzania funkcji, co oznacza, że ​​każda linia jest równo rozmieszczona w czasie, więc tylko przy użyciu wartości Y, dlatego staram się to robić w dziwny sposób, gdy widzisz mój kod.

Rodzaj wartości, którymi musi się zająć, 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, to linia prosta między nimi, ale kiedy zmieniają się jak od X = 10 na osłonach, w tym przykładzie staje się falą sinusoidalną.

Patrzyłem na równania dla interpolacji itp. I innych postów tutaj, ale nie robiłem tego rodzaju matematyki od lat i niestety nie mogę już tego rozgryźć, ponieważ są 2 niewiadome i nie mogę myśleć jak zaprogramować to na c #.

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++;
}

a to tworzy bliski przebieg, ale wciąż jest bardzo skokowy.

Czy więc ktoś może zobaczyć, dlaczego nie jest to bardzo dokładne? Jak poprawić dokładność? Lub inny sposób robienia tego za pomocą tablic?

Dzięki za szukanie :)

questionAnswers(2)

yourAnswerToTheQuestion