平時,經常會遇到解方程,計算方法中常用的有二分法(精度太低,迭代次數多,一般沒人用),牛頓迭代法,弦截法,網上大多都是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 = 0; while (Math.Abs(x2 - x1) >= e) { x = (x1 + x2) / 2; if (fun(x1) * fun(x) < 0) { x2 = x; } if (fun(x2) * fun(x) < 0) { x1 = x; } if (0 == 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 = 0; 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 = 0; 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 = 0; double x3 = 0; while (Math.Abs(x2 - x1) > e) { x3 = fun(x1, x2); x1 = x2; x2 = x3; count++; } return x3; } }