參考
Option Explicit
Sub TEST()
Dim X, Y, a, b, c, n, U1, U2, u, v, S, S0, S1, Y0, Y1, X1, X2, P, J
J = 1: Y = a * X ^ n + b * X + c: a = 1: b = 2: c = -4: n = 2
If n = 2 Then
If (4 * a * c - b ^ 2) / 4 * a = 0 Then
MsgBox "唯一解 X= " & (-b) / (2 * a): Exit Sub
ElseIf ((4 * a * c - b ^ 2) / 4 * a > 0 And a > 0) Or ((4 * a * c - b ^ 2) / 4 * a < 0 And a < 0) Then
MsgBox " X 無解!": Exit Sub
End If
If b = 0 And c < 0 Then X1 = (-c / a) ^ 0.5: X2 = -(-c / a) ^ 0.5
End If
888: S0 = -100 * J: S1 = 100 * J: S = J: P = 1
999
For X = S0 To S1 Step S
Y0 = a * X ^ n + b * X + c
Y1 = (a * (X + S)) ^ n + (b * (X + S)) + c
P = Y0 * Y1
If (S < 10 ^ -13 And J = 1) Or (S > -(10 ^ -13) And J = -1) Then P = 0
If P = 0 Then
If c = 0 And J = 1 Then X1 = X
If c = 0 And J = -1 Then X2 = X
If J = -1 Then: MsgBox "X1= " & X1 & vbLf & vbLf & "X2= " & X2: Exit Sub
J = -1: GoTo 888
ElseIf P < 0 Then
S0 = X: S1 = S0 + S: S = S / 10 '
If J = 1 Then
MsgBox "X1 介於 " & S0 & " ~ " & S1
X1 = S1
Else
MsgBox "X2 介於 " & S0 & " ~ " & S1
X2 = S1
End If
GoTo 999
End If
Next
End Sub
End Sub作者: 森野 時間: 2021-10-20 16:28
前輩您好 可以稍微簡單說明一下每項代表的意義嗎
這串以下好像是公式 設定這串的用意是什麼 (4 * a * c - b ^ 2) / 4 * a = 0 (如果不能用公式解是否可以不設定此項)
If n = 2 Then
If (4 * a * c - b ^ 2) / 4 * a = 0 Then
MsgBox "唯一解 X= " & (-b) / (2 * a): Exit Sub
ElseIf ((4 * a * c - b ^ 2) / 4 * a > 0 And a > 0) Or ((4 * a * c - b ^ 2) / 4 * a < 0 And a < 0) Then
MsgBox " X 無解!": Exit Sub
請前輩稍微說明一下
888 和999和 S0及S0 =-100*J和S1和 S1 =100*J 是什麼
還有以下的設定說明 想了解詳細
End If
888: S0 = -100 * J: S1 = 100 * J: S = J: P = 1
999
For X = S0 To S1 Step S
Y0 = a * X ^ n + b * X + c
Y1 = (a * (X + S)) ^ n + (b * (X + S)) + c
P = Y0 * Y1
If (S < 10 ^ -13 And J = 1) Or (S > -(10 ^ -13) And J = -1) Then P = 0
If P = 0 Then
If c = 0 And J = 1 Then X1 = X
If c = 0 And J = -1 Then X2 = X
If J = -1 Then: MsgBox "X1= " & X1 & vbLf & vbLf & "X2= " & X2: Exit Sub
J = -1: GoTo 888
ElseIf P < 0 Then
S0 = X: S1 = S0 + S: S = S / 10 '
If J = 1 Then
MsgBox "X1 介於 " & S0 & " ~ " & S1
X1 = S1
Else
MsgBox "X2 介於 " & S0 & " ~ " & S1
X2 = S1
End If
GoTo 999
End If
Next
End Sub
上述程式跑出來
X1=1.2360679774997,X2=-3.2360679774997
答案後面好像還少一項數字
X1=1.23606797749979,X2=-3.23606797749979
程式應該要怎麼改
感謝前輩作者: Andy2483 時間: 2021-10-21 08:53
Option Explicit
Sub 一元二次方程式()
'X ^ 2 + 2 * X - 4 = 0 有兩解
Dim X, S, S0, S1, Y0, Y1, X1, X2, P
S0 = -1000
S1 = 1000
S = 1
'↑設定變數初值
888
'↓開始迴圈(-1000 到 1000 間隔1)
For X = S0 To S1 Step S
Y0 = X ^ 2 + 2 * X - 4
Y1 = (X + S) ^ 2 + 2 * (X + S) - 4
P = Y0 * Y1
'↓運用二次函數在Y值=0前的負數與Y值=0後的正數乘積是負數
If P < 0 Then
S0 = X '重新給S0設定值
S1 = S0 + S '重新給S1設定值
S = S / 10 '重新給S設定值
MsgBox "X1 介於 " & S0 & " ~ " & S1
X1 = S1
GoTo 888 '結束迴圈,跳到 888 位置繼續執行
End If
Next
''''''''''''''''''''''''''''''''''''''''''''''''
S0 = 1000
S1 = -1000
S = -1
'↑重設變數初值
999
'↓開始迴圈(1000 到 -1000 間隔-1)
For X = S0 To S1 Step S
Y0 = X ^ 2 + 2 * X - 4
Y1 = (X + S) ^ 2 + 2 * (X + S) - 4
P = Y0 * Y1
If P < 0 Then
S0 = X
S1 = S0 + S
S = S / 10
MsgBox "X2 介於 " & S0 & " ~ " & S1
X2 = S1
GoTo 999
End If
Next
MsgBox "X1= " & X1 & vbLf & vbLf & "X2= " & X2
End Sub
Sub 一元二次方程式整數解1()
Dim X
For X = -1000 To 1000 Step 1
If X ^ 2 - 4 = 0 Then MsgBox "X = " & X
Next
End Sub
Sub 一元二次方程式整數解2()
'1奈米(nm)= 10 埃(A)= 10^-9m
'電腦要RUN 2000*10^9次判斷,EXCEL會感覺當掉
Dim X
For X = -1000 To 1000 Step 10 ^ -9
If X ^ 2 - 4 = 0 Then MsgBox "X = " & X
Next
End Sub作者: ML089 時間: 2021-10-23 16:13
Function f(x)
f = x ^ 2 + 2 * x - 4
End Function
Sub 一元方程式暴力解法_ML089()
Dim r, c1, c2, n, x, x2, s, ss, ct, tm
tm = Timer
'[A:C].Clear
Sheets.Add.Name = Format(Now(), "dd_hhmmss")
x = -10000: x2 = 10000 '查詢區間
s = 1: ss = 100 'Step 初始值及細分除數
r = 3: c1 = 1: c2 = 2 'cells 位置
Cells(r, c1).Resize(, 3) = Array("x1", "x2", "f(x1)")
While x <= x2
ct = ct + 1
If Application.Median(f(x), 0, f(x + s)) = 0 Then
r = r + 1
Cells(r, c1).Resize(, 3) = Array(x, x + s, f(x)) 'Debug 用
If Round(f(x), 12) = 0 Then
r = r + 1
Cells(r, c1) = "近似解:" & x & " , " & f(x)
x = x + s
s = 1
Else
s = s / ss
End If
Else
x = x + s
End If
Wend
Cells(r + 1, c1) = "循環次數:" & ct
Cells(r + 2, c1) = "計算時間:" & Format(Timer - tm, "0.000")
End Sub作者: ML089 時間: 2021-10-23 16:32
Option Explicit
Sub 一元一二三四次方程式_實數解()
Dim InB$, Q$, i&, x#, x1#, a#, a1#, a2#, b#, c#, s#, S0#, S1#, S2#, Y0#, Y1#
Dim P#, J$, T&, d&, Arr, st#, S3#, K$, K1$, K2$, Kb$, Kc$
InB = UCase(InputBox("請輸入方程式 例: X4-6X3+X2+2X+24=0", "請輸入", "2X4-4X3-3X2+7X-2=0"))
If (InB Like "*0" = False And InB Like "*#") Or InB Like "*X" Then InB = InB & "=0"
Q = InB: InB = Replace(InB, " ", "")
If InB Like "*X*=0" = False Or InB Like "*,*" Then T = -1: GoTo 777
If InB Like "X*" Then InB = "1" & InB
If InB Like "-X*" Then InB = "-1" & InB
InB = Replace(Replace(InB, "+X", "+1X"), "-X", "-1X")
InB = Replace(Replace(Replace(Replace(InB, "X4=", "X4+0="), _
"X3=", "X3+0="), "X2=", "X2+0="), "X1=", "X1+0=")
InB = Replace(Replace(Replace(Replace(InB, "+", ",+"), "-", ",-"), "=0", ",=,"), "X", ",X")
Arr = Split(InB, ",")
If InStr(",X4,X3,X2,X,", "," & Arr(1) & ",") = 0 Then T = -3: GoTo 777
For i = 0 To UBound(Arr)
If Arr(i) = "X4" Then a2 = Arr(i - 1)
If Arr(i) = "X3" Then a1 = Arr(i - 1)
If Arr(i) = "X2" Then a = Arr(i - 1)
If Arr(i) = "X" Then b = Arr(i - 1)
If Arr(i) = "=" Then c = Arr(i - 1)
Next
K = a: K1 = a1: K2 = a2: Kb = b: Kc = c:
If K & K1 & K2 & Kb & Kc Like "*0.*" Then T = -4: GoTo 777
T = 0: d = 26: S0 = -10001: S1 = 10001: S2 = S1: s = 0.5: st = s: P = 1
999
For x = S0 To S1 Step s
DoEvents
If s = st Then S3 = x
Y0 = a2 * x ^ 4 + a1 * x ^ 3 + a * x ^ 2 + b * x + c: x1 = x + s
Y1 = a2 * x1 ^ 4 + a1 * x1 ^ 3 + a * x1 ^ 2 + b * x1 + c
If Y0 = 0 Then
J = J & vbLf & "實數解X = " & x: S0 = S3 + s: S1 = S2: GoTo 999
End If
If Y1 = Y0 Then S0 = x + st: S1 = S2: GoTo 999
P = Y0 * Y1
If Int(Abs(P * 10 ^ d)) = 0 Then
T = T + 1
If s <> st Then J = J & vbLf & "實數解X = " & x1
s = st: S0 = S3 + s: S1 = S2: GoTo 999
End If
If Int(Abs(s * 10 ^ d)) = 0 Then P = 0
If P < 0 Then
S0 = x: S1 = S0 + s: s = s / 10: GoTo 999
ElseIf P > Abs(a2) + Abs(a1) + Abs(a) + Abs(b) + Abs(c) Then
S0 = x + st: S1 = S2: GoTo 999
End If
Next
777
If T > 0 Then
MsgBox Q & vbLf & J
ElseIf T = 0 Then
MsgBox Q & vbLf & vbLf & " X 無實數解!"
Else
MsgBox Q & vbLf & vbLf & " 無法執行!"
End If
End Sub作者: ML089 時間: 2021-10-25 21:49
Function f(x)
'f = x ^ 2 + 2 * x - 4
'f = x ^ 4 - 6 * x ^ 3 + x ^ 2 + 2 * x + 24
f = 2 * x ^ 4 - 4 * x ^ 3 - 3 * x ^ 2 + 7 * x - 2 '人工填入方程式
End Function
Sub 一元方程式暴力解法_ML089()
Dim r, c1, c2, n, x, x2, s, s1, ss, ct, tm, xNo, xN
tm = Timer
ThisWorkbook.Sheets.Add(After:=Worksheets(1)).Name = Format(Now(), "dd_hhmmss") '
x1 = -10000: x2 = 10000: x = x1 '查詢區間
s = 100: s1 = 0.1: ss = 10: 'Step 初始值使用s,找解1區間後使用s1,ss區間細分除數
xNo = 4: xN = 0 '一元幾次 : 計次
r = 3: c1 = 1: c2 = 2 'cells 位置
'Cells(r, c1).Resize(, 3) = Array("x1", "x2", "f(x1)")
While x <= x2
'DoEvents '會增加計算時間
ct = ct + 1 '循環次數
If Application.Median(f(x), 0, f(x + s)) = 0 Then '解答是否在x與x+s之間
'r = r + 1: Cells(r, c1).Resize(, 3) = Array(x, x + s, f(x)) 'Debug 用
If Round(f(x), 12) = 0 Then '精度小數12位數為0時為近似解
xN = xN + 1: r = r + 1
ANS = "近似解:X" & xN & " = "
If f(Round(x, 12)) = 0 Then '真實解判斷與修正
x = Round(x, 12)
ANS = "真實解:X" & xN & " = "
End If
Cells(r, c1) = ANS & x & " ,f(x) = " & f(x)
If xN = xNo Then GoTo 999 '解答完成跳出迴圈
x = x + s
s = s1
Else
s = s / ss '目前x~x+s區間,s再細分1/SS倍
End If
Else
x = x + s
End If
Wend
999:
Cells(r + 1, c1) = "查詢區間:" & x1 & " " & x2
Cells(r + 2, c1) = "Step 初始值及細分除數:" & s1 & " " & ss
Cells(r + 3, c1) = "循環次數:" & ct
Cells(r + 4, c1) = "計算時間:" & Format(Timer - tm, "0.000")
End Sub
'可以刪除日測試工作表
Sub Del_Sheet()
Dim MyBook As Workbook, sh As Worksheet
Set MyBook = ThisWorkbook
Application.DisplayAlerts = False '停止系統的警示
For Each sh In MyBook.Sheets
If sh.Name Like Day(Now()) & "_*" Then sh.Delete '刪除當日 DD_*
Next
Application.DisplayAlerts = True '恢復系統的警示
End Sub作者: Andy2483 時間: 2022-9-28 22:01