C# числовые рецепты

Я начинающий в C# и программирования в целом, и я хочу спросить. Я пытаюсь сделать проект с datagridview в нем и некоторые расчеты. По сути, я хочу сделать из таблицы эмпирических данных приблизительные данные с помощью аппроксимации Чебышева. Используя код из числовых рецептов, я хочу использовать этот fuction, chebft, и это выглядит так:

void chebft(NRREAL a, NRREAL b, NRREAL c[], int n, NRREAL (*func)(NRREAL))
{ 
    int k,j;
    NRREAL fac,bpa,bma,*f;

    f=vector(0,n-1);
    bma=NR_1_2*(b-a);
    bpa=NR_1_2*(b+a);
    for (k=0;k<n;k++) {
    NRREAL y=cos(NR_PI*(k+NR_1_2)/n);
    f[k]=(*func)(y*bma+bpa);
    }
    fac=NR_2/n;
    for (j=0;j<n;j++) {
    NRZEAL sum=NR_0;
    for (k=0;k<n;k++)
        sum += f[k]*cos(NZ_PI*j*(k+NZ_1_2)/n);
    c[j]=fac*(NRREAL)sum;
    }
    free_vector(f,0,n-1);
}

и я хочу использовать его в C#, так что у меня есть до сих пор:

public void chebft(double a, double b, double[] c, int n, double func)  
    {
        int k,j;
        double fac, bpa, bma;

        double PI = 3.14159265358979323846;
        Vector f = new Vector(0, n - 1);
        bma = 0.5 * (b - a);
        bpa = 0.5 * (b - a);

        for (k = 0; k < n; k++)
        { 
            double y = Math.Cos(PI*(k+0.5)/n);
            f[k] = (func)(y*bma+bpa);
        }

        fac = 2.0 / n;
        for (j = 0; j < n; j++)
        {
            double sum = 0.0;

            for (k = 0; k < n; k++)
            {
                sum += f[k] * Math.Cos(PI * j * (k + 0.5) / n);
                c[j] = fac * (double)sum;
            }
        }

    }

Я знаю, что в этой функциональной части и в f [k] есть ошибки, но я не знаю, как их исправить.

Спасибо за помощь

1 ответ

Перевод представляется относительно надежным с одним исключением (оставляя в стороне возможные числовые проблемы, требующие более глубокого знания проблемы для диагностики):

Указатель на функцию func принимает двойной параметр и возвращает двойной. Чтобы передать такую ​​лямбда-функцию в C#, которая по существу эквивалентна указателю на функцию в C++, используйте следующую форму:

Func<double, double> func

Затем вы можете вызвать функцию следующим образом:

f[k] = func(y*bma+bpa);

Более подробную информацию можно найти здесь.

Также обратите внимание, что вам не нужно разыгрывать sum удвоить в последнем цикле, так как он уже является двойным, и что Math класс уже определяет константу Math.PI,

Другие вопросы по тегам