主题:[原创]一元高次方程求解(递归、降次、牛顿迭代)
老大徒伤悲
[专家分:29120] 发布于 2008-10-03 12:15:00
敬请大家多提宝贵意见。
回复列表 (共23个回复)
11 楼
天天学习 [专家分:4570] 发布于 2009-07-22 22:03:00
现在下载的怎么没源码?
12 楼
老大徒伤悲 [专家分:29120] 发布于 2009-07-23 20:35:00
奥,我本想完善后再上传代码供大家参考的,但…………
13 楼
383026016 [专家分:0] 发布于 2010-11-28 09:12:00
怎么了?楼主
但...什么啊
不是现在又不舍得发源码了吧
14 楼
老大徒伤悲 [专家分:29120] 发布于 2010-11-28 14:38:00
仍未完善!
15 楼
383026016 [专家分:0] 发布于 2010-12-01 08:55:00
楼主发代码来我们看看呗
现在我是一点头绪都没有呢
就当是学习下了
不胜感激啊
16 楼
老大徒伤悲 [专家分:29120] 发布于 2010-12-02 11:37:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2010-12-02 11:38:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2010-12-02 11:38:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2010-12-02 11:39:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2010-12-02 11:41:00
左界 = 低节点(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
我来回复