平时,经常会遇到解方程,计算方法中常用的有二分法(精度太低,迭代次数多,一般没人用),牛顿迭代法,弦截法,网上大多都是C++或者Java的实现代码,很少有C#的,我在本科毕业论文中用到了这些,那时也需要做一个winfrom,所以就用了C#,因此今天正好借这篇文章,把我的代码修改一下,公布出来,当然,代码有很多不足,扩展性也比较差,所以还希望大家多多指教喽。
public static class Equation
{
//二分法
//[x1,x2]为近似解区间,e为求解精度,fun为求解方程
public static double Dichotomy(Func<double, double> fun, double x1, double x2, double e)
{
double x = ;
while (Math.Abs(x2 - x1) >= e)
{
x = (x1 + x2) / ;
if (fun(x1) * fun(x) < )
{
x2 = x;
}
if (fun(x2) * fun(x) < )
{
x1 = x;
}
if ( == fun(x))
{
return x;
}
}
return x;
} //牛顿迭代法
//fun为牛顿迭代公式!!f(x)=x-f(x)/f'(x)
//x1为方程初始解,e为方程求解精度
public static double Newton(Func<double, double> fun, double x1, double e)
{
int count = ;
double x2 = fun(x1);
while (Math.Abs(x2 - x1) >= e)
{
x1 = x2;
x2 = fun(x1);
count++;
}
return x2;
} //单点弦截法,即不动点迭代法
//f(x)=x0-(x-x0)/(f(x)-f(x0))*f(x0) x0为不动点,一般常选取区间的一个端点。
//x1为区间的另一个端点,e为方程解的精度
public static double Single(Func<double, double> fun, double x1, double e)
{
int count = ;
double x2 = fun(x1);
while (Math.Abs(x2 - x1) >= e)
{
x1 = x2;
x2 = fun(x1);
count++;
}
return x2;
} //割线法
public static double Sec(Func<double, double, double> fun, double x1, double x2, double e)
{
int count = ;
double x3 = ;
while (Math.Abs(x2 - x1) > e)
{
x3 = fun(x1, x2);
x1 = x2;
x2 = x3;
count++;
}
return x3;
}
}