Можете ли вы использовать формулу для реализации Солвера или найти численное решение? - PullRequest
0 голосов
/ 12 апреля 2019

Есть ли способ реализовать Солвер в формуле , чтобы найти нули данной функции численно? Или решить проблему оптимизации (поиск корня можно переформулировать как проблему оптимизации)?

Solver имеет графический интерфейс, который в основном позволяет решать одну ячейку за раз.

Вы можете автоматизировать это с помощью VBA, но вывод остается статичным, т. Е. Если ячейки меняются, вам нужно снова запустить код VBA.

Если вместо этого он может быть реализован в виде формулы, он будет автоматически пересчитан при изменении своих входных данных. Это вообще возможно?

Позвольте мне привести пример с расчетом приведенной стоимости и внутренней нормы прибыли; да, я знаю, что в Excel есть формула для ее расчета, моя - только пример.

C6: C8 - денежные потоки; внутренняя норма прибыли - это ставка, которая приводит к тому, что чистая приведенная стоимость этих денежных потоков равна нулю

Есть ли способ написать формулу в C11 для расчета скорости, которая приводит к тому, что целевая функция (NPV в C10) становится равной нулю?

В основном что-то вроде fsolve() в Matlab или Python scipy ?

Единственное, о чем я могу думать, это написать UDF в VBA для реализации чего-то вроде метода сечения или алгоритма Ньютона Рапсона для численного решения , но это будет похоже на переизобретение рулевое колесо. Плюс IRR - очень простой случай, но для более сложных вычислений я не уверен, что VBA - лучший инструмент. Это единственный вариант?

enter image description here

EDIT : было предложено, чтобы установка Solver AddIn сделала доступными функции в Excel, такие как SolverOk (). Однако, насколько я понимаю, эти функции должны использоваться в коде VBA, а не вводиться в электронную таблицу Excel. Или, по крайней мере, если есть способ, я его не нашел. Например, если я использую SolverOk() согласно синтаксису в ссылке, я получаю ошибку #Value!. Это после включения ссылки на Солвер, как объяснено в ссылке.

1 Ответ

0 голосов
/ 18 апреля 2019

Я предлагаю сделать Солвер динамическим, используя Define Names и Worksheet Event

  1. Используя предоставленный образец, создайте следующее Names:
    a._Goal расположен по адресу C11
    б._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

...