回 帖 发 新 帖 刷新版面

主题:[原创]一元高次方程求解(递归、降次、牛顿迭代)

敬请大家多提宝贵意见。

回复列表 (共23个回复)

11 楼

现在下载的怎么没源码?

12 楼

奥,我本想完善后再上传代码供大家参考的,但…………

13 楼


怎么了?楼主
但...什么啊
不是现在又不舍得发源码了吧

14 楼

仍未完善!

15 楼


楼主发代码来我们看看呗
现在我是一点头绪都没有呢
就当是学习下了
不胜感激啊

16 楼

VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   5625
   ClientLeft      =   60
   ClientTop       =   600
   ClientWidth     =   9450
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   5625
   ScaleWidth      =   9450
   StartUpPosition =   3  '窗口缺省
   Begin VB.CommandButton Command3 
      Caption         =   "Command3"
      Height          =   495
      Left            =   4080
      TabIndex        =   7
      Top             =   2520
      Width           =   1215
   End
   Begin VB.TextBox Text2 
      Height          =   495
      Index           =   1
      Left            =   0
      TabIndex        =   5
      Text            =   "Text2"
      Top             =   0
      Width           =   1215
   End
   Begin VB.CommandButton Command2 
      Caption         =   "Command2"
      Height          =   495
      Left            =   4320
      TabIndex        =   4
      Top             =   1320
      Width           =   1215
   End
   Begin VB.TextBox Text2 
      Height          =   495
      Index           =   0
      Left            =   5400
      TabIndex        =   2
      Text            =   "Text2"
      Top             =   2520
      Width           =   1215
   End
   Begin VB.TextBox Text1 
      Height          =   495
      Left            =   2520
      TabIndex        =   1
      Text            =   "Text1"
      Top             =   2640
      Width           =   1215
   End
   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =   495
      Left            =   5280
      TabIndex        =   0
      Top             =   3360
      Width           =   1215
   End
   Begin VB.Label Label4 
      Caption         =   "Label4"
      Height          =   495
      Left            =   3840
      TabIndex        =   6
      Top             =   3720
      Width           =   1215
   End
   Begin VB.Label Label1 
      Caption         =   "Label1"
      Height          =   855
      Left            =   1200
      TabIndex        =   3
      Top             =   5640
      Width           =   1095
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

17 楼

Option Explicit
Const 标题 = "一元高阶方程"
Const 字号 = 28
Const 宽 = 15000
Dim 阶数 As Integer, 系数() As Double, 允许误差 As Double, 高 As Single

Private Sub 新方程()
    Dim i As Integer, s As String
输入:
    s = InputBox("请输入方程中未知数的最高指数(99~0) " & vbCrLf & "点“取消(Cancel)”按钮或输入0,表示退出。", 标题, 2)
    If Len(s) > 4 Then
        MsgBox "输入这么长!咋看咋不像个指数的样子。" & vbCrLf & "好好输入,我才给你解方程。", vbOKOnly + vbExclamation, 标题 & "--负阶数"
        GoTo 输入
    End If
    阶数 = Val(s)
    If 阶数 < 0 Then
        MsgBox "负指数方程看着就烦人!" & vbCrLf & "况且方程里头真的连常数项都没有?", vbOKOnly + vbExclamation, 标题 & "--负阶数"
        GoTo 输入
    ElseIf 阶数 > 99 Then
        MsgBox "你还真不客气呢,任意也有个限制阿。" & vbCrLf & "实话告诉你,我实际只给你解99次以内的方程。", vbOKOnly + vbExclamation, 标题 & "--阶数过大"
        GoTo 输入
    End If
    
    If 阶数 = 0 Then End
    ReDim 系数(阶数)
    Cls
    If Text2.UBound > 1 Then
        For i = Text2.UBound To 2 Step -1
            Unload Text2(i)
        Next i
    End If
    Label4.Visible = False
    For i = 阶数 To 0 Step -1
        If i > 1 Then Load Text2(i)
        Text2(i) = ""
    Next i
    系数界面
    Text2(阶数).SetFocus
    Label1.Visible = True
    Text1.Visible = True
    Command1.Caption = "确定"
    Command2.Visible = True
End Sub

Private Sub 系数界面()
    Dim 行高 As Single, 框高 As Single, 列宽 As Single, 框宽 As Single, i As Integer, x As Single, y As Single
    行高 = 33 * 字号
    列宽 = 50 * 字号
    框高 = 15 * 字号
    框宽 = 20 * 字号
    Me.ForeColor = vbRed
    For i = 阶数 To 0 Step -1
        Text2(i).Visible = True
        Text2(i).TabIndex = 阶数 - i
        x = 500 + ((阶数 - i) Mod 10) * 列宽
        y = 500 + ((阶数 - i) \ 10) * 行高
        Text2(i).Move x, y, 框宽, 框高
        FontSize = 字号
        CurrentX = x + 20 * 字号
        CurrentY = y
        If i = 0 Then
            Print "=0"
        Else
            Print "x";
            FontSize = 字号 / 2
            If i <> 1 Then Print Trim(Str(i));
            FontSize = 字号
            Print "+"
        End If
    Next i
    高 = y + 2200
    Form_Resize
End Sub

18 楼

Private Function 正式方程() As String
    Dim i As Integer, 左 As Single, 行高 As Single
    Cls
    左 = 10 * 字号
    行高 = 25 * 字号
    CurrentX = 左
    CurrentY = 左
    Me.ForeColor = vbBlue
    On Error GoTo 溢出:
    For i = 阶数 To 0 Step -1
        系数(i) = Val(Text2(i))
        Text2(i).Visible = False
        If CurrentX > Width / 8 * 7 Then
            CurrentX = 左
            CurrentY = CurrentY + 行高
        End If
        If 系数(i) <> 0 Then
            If i < 阶数 And 系数(i) > 0 Then Print "+";
            If 系数(i) <> 1 Or (系数(i) = 1 And i = 0) Then Print Trim(Str(系数(i)));
            If i <> 0 Then Print "x";
            If i > 1 Then
                FontSize = 字号 / 2
                Print Trim(Str(i));
                FontSize = 字号
            End If
        End If
    Next i
    On Error GoTo 0
    Print "=0"
    高 = CurrentY + 2200
    Form_Resize
    Exit Function
    
溢出:
    MsgBox "你输入的系数超出了我的想象能力。" & vbCrLf & "我以为我最强呢,真没有想到……", vbOKOnly + vbExclamation, 标题 & "--系数溢出"
    Text2(i) = ""
    Text2(i).SetFocus
    Me.Cls
    系数界面
    正式方程 = "溢出"
End Function

19 楼

Private Sub 分段(系数() As Double, 本阶数 As Integer, 节点() As Double, 节点数 As Integer)
    Dim 有解 As Boolean, 已解 As Boolean
    Dim 左界 As Double, 左值 As Double, 右界 As Double, 右值 As Double
    Dim 循环次数 As Long, 归零次数 As Long, 总次数 As Variant
    Dim i As Integer, 步长 As Double, 函数值 As Double, 解 As Double, 原解 As Double
    If 本阶数 = 1 Then
        节点数 = 0
        ReDim 节点(0)
        节点(0) = -系数(0)
    Else
        Dim 低系数() As Double, 低节点数 As Integer, 低节点() As Double
        ReDim 低系数(本阶数 - 1)
        低系数(本阶数 - 1) = 系数(本阶数) * 本阶数
        For i = 1 To 本阶数 - 1
            低系数(i - 1) = 系数(i) * i / 低系数(本阶数 - 1)
        Next i
        低系数(本阶数 - 1) = 1
        分段 低系数(), 本阶数 - 1, 低节点(), 低节点数
        节点数 = -1
        For i = 0 To 低节点数 + 1
            有解 = False
            已解 = False
            If i = 0 Then
                If 低节点数 = -1 Then '只有一段
                    有解 = True
                    左界 = 0
                    右界 = 1
                    左值 = 函数(系数(), 本阶数, 左界)
                    右值 = 函数(系数(), 本阶数, 右界)
                    Do
                        If 左值 = 0 Then
                            已解 = True
                            解 = 左界
                            Exit Do
                        ElseIf 右值 = 0 Then
                            已解 = True
                            解 = 右界
                            Exit Do
                        ElseIf Sgn(左值) <> Sgn(右值) Then
                            Exit Do
                        ElseIf Abs(左值) > Abs(右值) Then
                            步长 = (右界 - 左界) * 1.5
                            左值 = 右值
                            左界 = 右界
                            右界 = 左界 + 步长
                            右值 = 函数(系数(), 本阶数, 右界)
                        Else
                            步长 = (右界 - 左界) * 1.5
                            右界 = 左界
                            右值 = 左值
                            左界 = 右界 - 步长
                            左值 = 函数(系数(), 本阶数, 左界)
                        End If
                    Loop
                Else '不只一段的第一段

20 楼

左界 = 低节点(i - 1)
                左值 = 函数(系数(), 本阶数, 左界)
                右界 = 左界 + 允许误差 * 10000
                右值 = 函数(系数(), 本阶数, 右界)
                If 左值 <> 0 And Abs(左值) > Abs(右值) Then
                    有解 = True
                    Do
                        If 左值 = 0 Then
                            已解 = True
                            解 = 左界
                            Exit Do
                        ElseIf Sgn(左值) <> Sgn(右值) Then
                            Exit Do
                        Else
                            步长 = (右界 - 左界) * 1.5
                            左界 = 右界
                            左值 = 右值
                            右界 = 左界 + 步长
                            右值 = 函数(系数(), 本阶数, 右界)
                        End If
                    Loop
                End If
            Else '不只两段的中间各段
                左界 = 低节点(i - 1)
                右界 = 低节点(i)
                左值 = 函数(系数(), 本阶数, 左界)
                右值 = 函数(系数(), 本阶数, 右界)
                If Sgn(左值) <> Sgn(右值) And 左值 <> 0 Then 有解 = True
            End If
            If 有解 Then
                If Not 已解 Then
                    循环次数 = 0
                    归零次数 = 0
                    Do
                        步长 = (右界 - 左界) / (右值 - 左值) * 右值
                        解 = 右界 - 步长
                        函数值 = 函数(系数(), 本阶数, 解)
                        If 函数值 = 0 Then Exit Do
                        If Abs(步长 / 解) < 0.00000000000001 Then Exit Do
                        If Sgn(函数值) = Sgn(左值) Then
                            左值 = 函数值
                            左界 = 解
                            原解 = 解
                        Else
                            右界 = 解
                            右值 = 函数值
                            原解 = 解
                        End If
                        If 循环次数 = 2147483647 Then
                            循环次数 = 0
                            归零次数 = 归零次数 + 1
                        End If
                        循环次数 = 循环次数 + 1
                        总次数 = 2147483647
                        总次数 = 总次数 * 归零次数 + 循环次数
                    Loop Until Abs(原解 - 解) < 允许误差 / 10 And Abs(函数值) < 允许误差 * Sqr(总次数)
                End If

我来回复

您尚未登录,请登录后再回复。点此登录或注册