有没有办法让目标寻求的界限? 如果不是的话,你会怎么做呢?

我试图通过改变在F1中发现的De的值来最小化残差平方和的值。 我希望计算的CFL的值尽可能接近CFL测量的值。 这些残差平方和越小,配合越好! 在问一些build议的stackoverflow之后,我决定使用Goal Seek通过改变De的值来尽量减less残差的平方和以尽可能地接近于零,我想find最理想的值。

我得到这个程序运行完美,所以我想…我发现,而不是使用=SUM(D2:D14)总结每一个残差,我不小心使用=SUM(D2,D14) 。 所以我只是总结了第一个和最后一个数字。

现在我正在试着总结每一个残差,我得到了这些疯狂的错误,以及De的疯狂价值。

我知道德的价值必须大于零,小于一。 我怎么能用这些界限来把这个目标集中在一定范围内? 在这种情况下,De的答案是大约.012,如果有帮助的话。 我不断收到错误#NUM! 在所有的残留细胞。 这是因为溢出问题?

如果你认为使用“目标寻求”(Goal Seek)通过findDe的最理想值来最小化这些总和将是行不通的,那么你会如何去做呢? 有没有其他解决scheme可以使用?

这里是代码:

 Option Explicit Dim Counter As Long Dim DeSimpleFinal As Double Dim simpletime As Variant Dim Tracker As Double Dim StepAmount As Double Dim Volume As Double Dim SurfArea As Double Dim pi As Double Dim FinalTime As Variant Dim i As Variant Sub SimpleDeCalculationNEW() 'This is so you can have the data and the table I'm working with! Counter = 13 Volume = 12.271846 SurfArea = 19.634954 pi = 4 * Atn(1) Range("A1") = "Time(days)" Range("B1") = "CFL(measured)" Range("A2").Value = 0.083 Range("A3").Value = 0.292 Range("A4").Value = 1 Range("A5").Value = 2 Range("A6").Value = 3 Range("A7").Value = 4 Range("A8").Value = 5 Range("A9").Value = 6 Range("A10").Value = 7 Range("A11").Value = 8 Range("A12").Value = 9 Range("A13").Value = 10 Range("A14").Value = 11 Range("B2").Value = 0.0612 Range("B3").Value = 0.119 Range("B4").Value = 0.223 Range("B5").Value = 0.306 Range("B6").Value = 0.361 Range("B7").Value = 0.401 Range("B8").Value = 0.435 Range("B9").Value = 0.459 Range("B10").Value = 0.484 Range("B11").Value = 0.505 Range("B12").Value = 0.523 Range("B13").Value = 0.539 Range("B14").Value = 0.554 Range("H2").Value = Volume Range("H1").Value = SurfArea Range("C1") = "CFL Calculated" Range("D1") = "Residual Squared" Range("E1") = "De value" Range("F1").Value = 0.1 'Inserting Equations Range("C2") = "=((2 * $H$1) / $H$2) * SQRT(($F$1 * A2) / PI())" Range("C2").Select Selection.AutoFill Destination:=Range("C2:C" & Counter + 1), Type:=xlFillDefault Range("D2") = "=((ABS(B2-C2))^2)" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D" & Counter + 1), Type:=xlFillDefault 'Summing up the residuals squared Range("D" & Counter + 2) = "=Sum(D2: D" & Counter + 1 & ")" 'Goal Seek Range("D" & Counter + 2).GoalSeek Goal:=0, ChangingCell:=Range("F1") Columns("A:Z").EntireColumn.EntireColumn.AutoFit DeSimpleFinal = Range("F1") MsgBox ("The Final Value for DeSimple is: " & DeSimpleFinal) End Sub 

你得到了NUM个错误,因为在当前的解决scheme中,F1的值是负值,而你试图在你的一个expression式中取F1的平方根。

此外,在这种情况下,目标search对于F1正在使用的特定初始“猜测”非常敏感。 如果你在现在使用的0.1的两边改变F1的初始值,这将是明显的。 实际上,在目标寻求解决scheme中存在很大的不稳定区域,取决于F1值:

目标寻求不稳定性

当您提出问题时,如果您可以对解决schemesearch的可能input设置约束条件,则更有可能得到可用的结果。 Excel附带一个称为Solver的插件,可以提供几种不同的search方法。 求解器不会自动加载,当你第一次启动Excel,但加载它很容易, 这里解释。

你要求其他解决者。 有关替代方法和一些理论来帮助理解发生了什么,请参阅“数字食谱” (网上书籍)。 第10章处理这个。 它包括现成的代码示例,如果你想尝试一些不同于GoalSeek或Solver加载项的东西。 当然代码是在Fortran / C / C ++中,但是这些代码很容易转换成VBA(我已经做了很多次)。

goalseek函数使用一个二分法algorithm,可以这样编码:

 Sub dicho(ByRef target As Range, ByRef modif As Range, ByVal targetvalue As Double, ByVal a As Double, ByVal b As Double) Dim i As Integer Dim imax As Integer Dim eps As Double eps = 0.01 imax = 10 i = 0 While Abs(target.Value - targetvalue) / Abs(targetvalue) > eps And i < imax modif.Value = (a + b) / 2 If target.Value - targetvalue > 0 Then a = (a + b) / 2 Else b = (a + b) / 2 End If i = i + 1 Wend End Sub 

哪里和你是你的界限。