C# 求三次和非线性方程的根MathNet.RootFinding

2023-12-20 09:54:18

文章目录

初步使用

RootFinding是MathNet的数值求根模块,内部封装了多种求根方法,均封装在静态类中。这些静态类一般提供三种求根方法,分别是FindRoot,FindRootExpand以及TryFindRoot,下表列出这些静态类,以及这些静态类支持哪种求根方案

类名FindRootTryFindRootFindRootExpand
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是求根的下限和上限。

Cubic

对于三次方程,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?

文章来源:https://blog.csdn.net/m0_37816922/article/details/134925827
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。