二分法 - C#
Bisection Method - C#
我有一个名为 Bisection method 的函数,它接受 4 个参数,delegate函数,区间的 start 和 end 以及解决方案的用户 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(),我们如何处理这个?
问题是:如果fun
是Math.Sqrt(double)
,start
是负数,那么fun(start)
是NaN
,fun(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 < -1
和 end > 1
。
我有一个名为 Bisection method 的函数,它接受 4 个参数,delegate函数,区间的 start 和 end 以及解决方案的用户 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(),我们如何处理这个?
问题是:如果fun
是Math.Sqrt(double)
,start
是负数,那么fun(start)
是NaN
,fun(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 < -1
和 end > 1
。