2017-06-08 1 views
0

im begginer en C# et la programmation en général et je veux demander. J'essaie de faire un projet avec datagridview et quelques calculs. Fondamentalement ce que je veux faire est à partir de la table des données empiriques aproximate les données avec l'aproximation de chebyshev. En utilisant le code de recettes numériques que je veux utiliser ce auj, chebft et il ressemble à ceci:C# recettes numériques

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

et je veux utiliser en C# donc ce que j'ai jusqu'à présent:

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

    } 

Je sais il y a des erreurs dans cette partie func et f [k] part, mais je ne sais pas comment les réparer.

Merci pour l'aide

+3

Vous devez en savoir plus sur les délégués C#. –

+2

En plus d'apprendre à déboguer du code, vous devriez aussi lire [mcve] et [demander] des informations importantes sur la façon de poser une question à Stack Overflow, les informations requises et comment vous assurer que vous avez présenté votre question d'une manière claire et responsable. Entre autres choses, vous écrivez _ "Je sais qu'il y a des erreurs" _, mais vous ne partagez pas avec nous pourquoi vous le savez, et vous ne fournissez pas un MCVE qui révèle ces erreurs, et n'expliquez pas pourquoi vous ne le faites pas. savoir comment les réparer. –

Répondre

1

La traduction semble être relativement solide à une exception près (en laissant de côté les questions numériques possibles qui nécessitent des connaissances plus avancées du problème pour diagnostiquer):

Le pointeur de la fonction func accepte une paramètre à double valeur et renvoie un double. Pour passer une telle fonction lambda en C#, qui est essentiellement équivalent à un pointeur de fonction en C++, utilisez le formulaire ci-dessous:

Func<double, double> func 

Vous pouvez ensuite appeler la fonction comme suit:

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

Plus d'informations peut être trouvé here.

Notez également que vous n'avez pas besoin de convertir sum en double dans la boucle finale, car il s'agit déjà d'un double, et que la classe Math définit déjà la constante Math.PI.