如何根据前一个循环的答案选择循环范围?

时间:2012-07-21 00:05:50

标签: excel vba excel-vba

我很遗憾这个标题措辞令人费解,但很难将这个问题简化为几句话。

我试图找到特定方程的最小值。起初我循环使用等式,为了我们的目的,这里可以像y = .245x^3-.67x^2+5x+12。我想设计一个循环,循环中的“步骤”变得越来越小。

例如,第一次循环时,它使用步骤1.我将得到大约30个值。我需要帮助的是如何使用从第一个循环中收到的三个最小值?

这是我可能从第一个循环获得的值的一个示例:(我应该注意到这根本不应该是实际的代码。它只是对正在发生的事情的简要描述)

loop from x = 1 to 8 with step 1

results:

x = 1 -> y = 30
x = 2 -> y = 28
x = 3 -> y = 25
x = 4 -> y = 21
x = 5 -> y = 18
x = 6 -> y = 22
x = 7 -> y = 27
x = 8 -> y = 33

我想要能够检测最低三个值并创建循环的东西。根据这些结果,获得y的最小三个结果的x值为x = 4, 5, and 6

所以我的“猜测”在这一点上将是x = 5.为了得到一个更好的“猜测”,我想要一个现在循环:

loop from x = 4 to x = 6 with step .5

我可以保持这种模式,直到我对x的最小值进行荒谬的准确猜测。

有人知道我可以这样做吗?我知道我将要获得的值可以通过抛物线开放来建模,所以这种格式肯定会有效。我在想这些价值观可以放在一个专栏中。要在该列中返回y的最小值以及相应的x值,这并不难。

如果我太模糊,请告诉我,我可以回答您的任何问题。

2 个答案:

答案 0 :(得分:1)

好的问题。这至少是我认为你应该为此做的一个开始:

Sub findMin()
    Dim lowest As Integer
    Dim middle As Integer
    Dim highest As Integer
    lowest = 999
    middle = 999
    hightest = 999

    Dim i As Integer
    i = 1
    Do While i < 9
        If (retVal(i) < retVal(lowest)) Then
            highest = middle
            middle = lowest
            lowest = i
        Else
            If (retVal(i) < retVal(middle)) Then
                highest = middle
                middle = i
            Else
                If (retVal(i) < retVal(highest)) Then
                    highest = i
                End If
            End If
        End If
    i = i + 1
    Loop
End Sub

Function retVal(num As Integer) As Double
    retVal = 0.245 * Math.Sqr(num) * num - 0.67 * Math.Sqr(num) + 5 * num + 12
End Function

我在这里做的是设置三个整数作为你的三个Min值:最低,中等和最高。循环遍历您插入公式的值(此处为retVal函数),并将retVal的返回值(因此名称)与retVal(最低),retVal(中间)和retVal(最高)的值进行比较,根据需要更换它们。我刚刚开始使用VBA,所以我所做的可能不是很优雅,但它至少确定了导致函数最低值的整数。您可能必须使用最低,中等和最高值来使其工作。我知道这并不是你想要的,但这是我认为你应该做的事情。

答案 1 :(得分:1)

除非问题范围缩小,否则没有简单的方法可以解决这个问题。

实际给出的示例多项式没有最小值,可以通过观察y'>0来确定(因此,y总是增加WRT x)。

鉴于对

的广泛解释
  

[an]等式,对于我们这里的目的,可以是y =   .245x ^ 3-.67x ^ 2 + 5×+ 12

即使假设域仅限于多项式,也需要检查许多条件。

多项式阶数很重要,并且该阶数确定了检查可能的解决方案数量所需的条件,或者是否可能存在任何解决方案。

如果不考虑这种复杂性,迭代方法可能会因为下溢错误或迭代步骤或边界的不幸选择而产生错误的解决方案。

我不是想在这里努力,我认为你的想法很简洁。在实践中,它比你想象的要复杂得多。