65.9K
CodeProject 正在变化。 阅读更多。
Home

使用二分法查找实根和虚根

2024年5月19日

MIT

1分钟阅读

viewsIcon

4908

downloadIcon

182

通过连续求导和二分法查找根。

引言

当前算法查找多项式的实根和虚根。多项式可能只有实系数,但根可能是共轭复数,并且一个根可能具有大于一的重数。该算法将找出实根和虚根。

背景

例如,(x^2+1)*(x-2) 在 -i, +i 处有两个共轭复根;以及一个实根 x=2。代码将找到这三个根。代码首先进行乘法

(x^2+1)*(x-2) = x^3-2*x^2+x-2

然后获得根。因此,您可以以 x^3-2*x^2+x-2 或 (x^2+1)*(x-2) 的方式输入多项式

使用代码

有一个类:BisectionRootFinder。实例化时,可以传递一个 Math10 多项式(Math10 是我 CAS 计算器的代码)。更可能的是,您将调用共享方法 BisectionRootFinder.ParseFromString(strPolynomial),将多项式作为字符串传递。

实例化时,执行根的查找。

现在,您可以调用 rrf.GetRealRootsrrf.GetImaginayRoots,将根作为 Double 数组获取。

 

Private Sub btnRoots_Click(sender As Object, e As RoutedEventArgs) Handles btnRoots.Click
    Dim sb As New System.Text.StringBuilder
    Try
        Globalization.CultureInfo.CurrentCulture = New Globalization.CultureInfo("en-US")
        Dim ts As Int64 = Now.Ticks
        Dim rrf As BisectionRootFinder = BisectionRootFinder.ParseFromString(tbPolynomial.Text)
        sb.Append("From polynomial " + vbCrLf + rrf.GetInitialPolynomial.ToString + vbCrLf + vbCrLf)
        sb.Append("Real Roots are:" + vbCrLf)
        If rrf.GetRealRoots.Length = 0 Then
            sb.Append("No real roots where found.")
        Else
            sb.Append(rrf.ToString)
        End If
        sb.Append(vbCrLf)
        sb.Append("Imaginary Roots are:" + vbCrLf)
        If rrf.GetImaginaryRoots.Length = 0 Then
            sb.Append("No imaginary roots where found.")
        Else
            sb.Append(rrf.ToStringImaginaryRoots)
        End If
        sb.Append(vbCrLf)
        Dim ts2 As New TimeSpan(Now.Ticks - ts)
        sb.Append(" " + Math.Round(ts2.TotalMilliseconds).ToString + " ms")
        tbRoots.Text = sb.ToString
    Catch ex As Exception
        tbRoots.Text = ex.Message
    End Try
End Sub

 

基本上,如果“p”是我们的多项式,并且例如是 4 次多项式,它将获得“p”的连续导数,次数为 3、2 和 1。然后它将获得 1 次多项式的边界(通过柯西边界);接下来是 2 次和 3 次多项式。通过二分法,1 次多项式的根(如果有)被添加为 2 次多项式的新边界(区间),依此类推,直到 4 次多项式。每个新根,在小于 4 次的多项式中,都会被评估在“p”中,以确认是否存在重数。如果存在重数,“p”将被降阶,并递归调用 .FindRoots

历史

版本 (1.0.2 2024/05/20

自然地,下一步是找到虚根。这是通过变量替换完成的:y=-i*x;和 z=sqr(y)

© . All rights reserved.