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





5.00/5 (2投票s)
通过连续求导和二分法查找根。
引言
当前算法查找多项式的实根和虚根。多项式可能只有实系数,但根可能是共轭复数,并且一个根可能具有大于一的重数。该算法将找出实根和虚根。
背景
例如,(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.GetRealRoots
和 rrf.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)