我想在Excel中優化三個參數以最小化實驗值和理論值之間的誤差。我使用Solver爲每個參數,每次一個,在for循環中。然而,我想迭代這個求解器for循環(循環內的循環),直到實驗值中的誤差和理論值小於某個目標值。VBA在Excel中使用求解器的宏優化不返回最佳變量
我的實驗值是$K25
。
我的理論值(根據我的模型方程計算)是$J$25
。
我的參數需要進行優化是$C$4
,$C$5
,$C$6
當我運行下面的VBA代碼我在參數$C$4
,$C$5
,$C$6
不從初始值改變。但是,宏編譯沒有錯誤。有人可以幫我從這裏出去嗎?
下面是代碼:
Sub Macro3()
Application.ScreenUpdating = False
SolverReset
Dim j As Integer
For j = 1 To 100 Step 1
If "$J$25" > "$K$25" Then
Dim i As Integer, s As String
For i = 4 To 6 Step 1
s = Format(i, "0")
SolverOk SetCell:="$J$25", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$" & s, Engine:= _
1, EngineDesc:="GRG Nonlinear"
SolverOptions MaxTime:=0, Iterations:=1000000, Precision:=0.000001, Convergence _
:=0.00001, StepThru:=False, Scaling:=True, AssumeNonNeg:=True, Derivatives:=1
SolverOptions PopulationSize:=100, RandomSeed:=0, MutationRate:=0.075, Multistart _
:=False, RequireBounds:=True, MaxSubproblems:=0, MaxIntegerSols:=0, _
IntTolerance:=1, SolveWithout:=False, MaxTimeNoImp:=30
SolverOk SetCell:="$J$25", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$" & s, Engine:= _
1, EngineDesc:="GRG Nonlinear"
SolverSolve (True)
SolverReset
Next i
End If
Next j
Application.ScreenUpdating = True
End Sub
謝謝!你的建議是正確的。我正在計算我的理論方程與我的實驗結果的總差異的絕對值。然後我優化我的參數以最小化這種差異。 $ K $ 25是我的目標差異,$ J $ 25是我目前的差額,基於$ C $ 4,$ C $ 5,$ C $ 6中的參數。所以是的,正如你所建議的,我可以簡單地解算器一次優化所有三個參數,我就完成了。但是,我最終希望在更復雜的方程中優化10個參數而不是3個參數。多個參數的組合將會非常棘手! – user2092724 2013-02-20 20:28:27
很確定Solver也可以處理10個參數,並獲得更好的結果,然後一個宏將每個參數錯誤地假設爲其他參數! – 2013-02-20 20:30:58
您建議的代碼有效。我只是測試它。但是,如果將$ K $ 25(目標差異)設置爲Solver收斂Excel所保留的值以下,並且不會得到任何結果。不知道你是否知道防止這種情況發生的快速方法? – user2092724 2013-02-20 20:38:27