您可以使用公式来实现求解器,还是可以找到数值解?

时间:2019-04-11 23:10:56

标签: excel numerical-methods

是否可以在公式中实现求解器,以数字方式找到给定函数的零?还是要解决一个优化问题(寻根也可以重新定义为一个优化问题)?

Solver具有一个GUI,基本上可以让您一次求解一个单元格。

您可以使用VBA自动执行此操作,但是输出仍然是静态的,即,如果单元格发生更改,则需要再次运行VBA代码。

相反,如果可以将其实现为公式,则将在其输入更改时自动重新计算。这有可能吗?

让我举例说明现值和内部收益率;是的,我知道Excel具有计算公式,我只是一个例子。

C6:C8是现金流量;内部收益率是导致这些现金流量的净现值为零的比率

是否可以在C11中编写公式来计算导致目标函数(C10中的NPV)为零的比率?

基本上像Matlab中的fsolve()还是Python的scipy一样?

我唯一能想到的就是在VBA中编写UDF来实现诸如二分法或Newton Rhapson算法之类的数值求解方法,但是感觉有点像在重塑车轮。另外,IRR是一个非常简单的情况,但是对于更复杂的计算,我不确定VBA是不是最好的工具。这是唯一的选择吗?

enter image description here

编辑:建议安装Solver插件使某些functions在Excel中可用,例如SolverOk()。但是,据我了解,这些功能将在VBA代码中使用,而不是输入到Excel扩展名中。或者,至少,如果有办法,我还没有找到。例如,如果我按照链接中的语法使用SolverOk(),则会收到#Value!错误。这是在按链接中所述启用对规划求解的引用之后。

1 个答案:

答案 0 :(得分:0)

我建议使用Define NamesWorksheet Event来使规划求解动态化

  1. 使用提供的示例,创建以下Names
    一种。 _Goal位于C11
    b。 _Input位于C6:C8
    C。 _Output位于C12
    d。 _Formula位于C10

  2. 在工作表的module中,复制以下Worksheet Event过程:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rGoal As Range, rInput As Range, rOutput As Range, rFormula As Range
    
        Application.EnableEvents = False
        Application.ScreenUpdating = False
    
        With Target.Worksheet
            Set rGoal = .Range("_Goal")
            Set rInput = .Range("_Input")
            Set rOutput = .Range("_Output")
            Set rFormula = .Range("_Formula")
            If Not (Application.Intersect(Target, rInput) Is Nothing) Then
                rOutput.ClearContents
                rFormula.GoalSeek Goal:=rGoal.Value2, ChangingCell:=rOutput
        End If: End With
    
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    
        End Sub
    

enter image description here