二分法 - C#

Bisection Method - C#

我有一个名为 Bisection method 的函数,它接受 4 个参数,delegate函数,区间的 startend 以及解决方案的用户 guess函数如下:

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

现在有一些情况我想处理:

1- 我们可以在区间开始处输入一个负数吗?如果是这样,我们如何处理 sqrt ?

2- 如果用户输入从零开始的区间,而我传递给委托的函数有Ln()或Log(),我们如何处理这个?

问题是:如果funMath.Sqrt(double)start是负数,那么fun(start)NaNfun(start) * fun(end)也是, 但 NaN > 0 的计算结果为 false.

您需要明确检查 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
}

此外,您可能需要检查循环内的 double.IsNaN(fun(avg)) 以处理例如fun = x => x * Math.Sqrt(x*x-1)start < -1end > 1