RootFinding是MathNet的数值求根模块,内部封装了多种求根方法,均封装在静态类中。这些静态类一般提供三种求根方法,分别是FindRoot,FindRootExpand以及TryFindRoot,下表列出这些静态类,以及这些静态类支持哪种求根方案
类名 | FindRoot | TryFindRoot | FindRootExpand |
---|---|---|---|
Bisection | ? | ? | ? |
Brent | ? | ? | ? |
Broyden | ? | ? | |
NewtonRaphson | ? | ? | |
RobustNewtonRaphson | ? | ? | |
Secant | ? | ? |
下面以二分法为例,解读一下这些静态函数的用法
using MathNet.Numerics.RootFinding;
Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
var r = Bisection.FindRoot(f, -100, 100);
Console.WriteLine($"f({r})={f(r)}");
//f(1.0848517200487713)=1.7763568394002505E-15
其中-100和100是求根的下限和上限。
对于三次方程,RootFinding提供了更加便捷的函数Cubic,其调用方方法非常简单,仍以上述函数 f = 3 x 3 + 2 x ? 6 f=3x^3+2x-6 f=3x3+2x?6为例,Cubic提供了求实根的函数RealRoots,其输入参数为a0,a1,a2,对应方程 a 0 + a 1 x + a 2 x 2 + x 3 = 0 a_0+a_1x+a_2x^2+x^3=0 a0?+a1?x+a2?x2+x3=0,顾
Func<double, double> f = x => 3 * Math.Pow(x, 3) + 2 * x - 6;
var rs = Cubic.RealRoots(-6/3.0, 2/3.0, 0/3.0);
Console.WriteLine($"f({rs.Item1})={f(rs.Item1)}");
//f(1.0848517200487715)=5.329070518200751E-15
Console.WriteLine($"f({rs.Item2})={f(rs.Item2)}");
//f(NaN)=NaN
Console.WriteLine($"f({rs.Item3})={f(rs.Item3)}");
//f(NaN)=NaN
最后只得到一个根,说明另外两个根是复数,Cubic提供了三次复数求解器,示例如下
Func<Complex, Complex> f = x => 3 * Complex.Pow(x, 3) + 2 * x - 6;
var rs = Cubic.Roots(-6, 2, 0, 3);
Console.WriteLine($"f({rs.Item1})={f(rs.Item1)}");
Console.WriteLine($"f({rs.Item2})={f(rs.Item2)}");
Console.WriteLine($"f({rs.Item3})={f(rs.Item3)}");
结果如下
f ( 1.084851720048777 ) = 7.460698725481052 E ? 14 f ( ? 0.5424258600243883 + ? 1.244726519174497 i ) = 7.5 × 1 0 ? 14 + 2.2 × 1 0 ? 15 f ( 0.5424258600243883 + 1.244726519174497 i ) = 7.5 × 1 0 ? 14 + 2.2 × 1 0 ? 15 \begin{aligned} f(1.084851720048777)=7.460698725481052E-14\\ f(-0.5424258600243883+-1.244726519174497i)=7.5\times10^{-14}+2.2\times10^{-15}\\ f(0.5424258600243883+1.244726519174497i)=7.5\times10^{-14}+2.2\times10^{-15} \end{aligned} f(1.084851720048777)=7.460698725481052E?14f(?0.5424258600243883+?1.244726519174497i)=7.5×10?14+2.2×10?15f(0.5424258600243883+1.244726519174497i)=7.5×10?14+2.2×10?15?