2017-10-09 4 views
-6

j'ai une fonction appelée méthode de bissection qui accepte 4 paramètres, délégué d'une fonction, démarrer et fin de l'intervalle et utilisateur suppose de la solution. Voici la fonction:bissection Method - C#

public static double Bisection_method (MyFun fun , double start , double 
    end, double? guess) 
    { 
     if (fun(start) * fun(end) > 0) 
     { 
      Console.WriteLine("wrong Entry"); 
      return -1; 
     } 

     double avg,tolerance,sign; 

     avg = (guess.HasValue) ? guess.Value : ((start + end)/2); 
     do 
     { 
      tolerance = Math.Abs (fun(end) - fun(start)); 

      sign = fun(start) * fun(avg); 
      if (sign < 0) 
       end = avg; 
      else if (sign > 0) 
       start = avg; 
      else 
      { 
       if (fun(start) == 0) 
        return start; 
       else return end; 
      } 

      avg = (start + end)/2; 
     } 
     while (tolerance > 0.0001); 

     return end; 
    } 

Maintenant, il y a certains cas, je veux traiter:

1- Peut-on entrer dans le début de l'intervalle un nombre négatif? et si oui, comment pouvons-nous gérer sqrt? Si l'utilisateur entre l'intervalle à partir de zéro, et la fonction que je passe au délégué a Ln() ou Log(), comment pouvons-nous gérer cela?

+0

Pourquoi est-ce étiqueté 'java'? – shmosel

+0

Ensuite, bien sûr, vous pouvez gérer les deux cas. Implémentez simplement ce que vous avez déjà comme description textuelle. Je veux dire, vous avez également réussi à écrire le code existant, ou pas? – AKSW

+0

et sur le double nullable, il est valide btw et le programme est en cours d'exécution –

Répondre

2

Le problème est le suivant: si fun est Math.Sqrt(double) et start est négatif, alors fun(start) est NaN et est donc fun(start) * fun(end), mais NaN > 0 est évaluée à false.

Vous devez vérifier explicitement NaN:

double fstart = fun(start); 
double fend = fun(end); 
if (double.IsNaN(fstart) || double.IsNaN(fend) || fstart * fend > 0) 
{ 
    Console.WriteLine("wrong Entry"); 
    return -1; // this may not be the best way to report an error 
} 

En outre, vous pouvez vérifier double.IsNaN(fun(avg)) dans la boucle pour gérer par exemple fun = x => x * Math.Sqrt(x*x-1) avec start < -1 et end > 1.