Юля: Как получить локальные переменные в функциях для nlsolve или минимизировать

Мне было интересно, как лучше всего экспортировать локальные переменные в целевую функцию для оптимизации или линейных решателей. Например, у меня есть такая функция, как:

function example(x)
    b = sum(x)
    return b * x' * x

затем я отправляю эту функцию в минимизатор. Предположим, он сходится. Я хочу получить значение b на последней итерации. Как я могу этого добиться?

У меня есть несколько пробных решений:

globalize b с помощью аффикса const (оберните его контейнером массива). Добавьте аргумент флага, чтобы указать, следует ли выводить b, затем снова запустите функцию с индикатором. Возьмите изменяемый контейнер b в качестве аргумента и измените его как побочный эффект функции. Насколько я понимаю, глобальные переменные имеют проблемы с производительностью, поэтому я должен стараться избегать; второй подход надежен, но он требует дополнительной итерации, что не кажется очень эффективным (хотя в большинстве моих приложений стоимость достаточно низка). Сейчас я использую третий метод, и пока он работает хорошо. Однако, поскольку я новичок в Джулии, я не уверен, есть ли у нее какие-то скрытые проблемы (например, совместимость с другими пакетами, такими как ForwardDiff?).

Спасибо за любой комментарий!

См. также:  Измените 'aaa' из легенды geom_text на соответствующий текст метки
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. SymbolRanger

    с ForwardDiff могут возникнуть проблемы, поскольку функция вычисляется по двойному числу. Но если вы работаете с конкретными числами, возможно, вы можете использовать множественную отправку для сохранения, когда функция оценивает:

    function store!(b::T, storage) where T<: AbstractFloat
    ...#store b in your storage
    end
    store!(b, storage) =nothing #does nothing on a ForwardDiff.Dual,for example
    

    а потом :

    function example(x)
        b = sum(x)
        store!(b, your_storage)
        return b * x' * x
    end
    

    Звучит очень умно. Большое спасибо! person SymbolRanger; 21.12.2019

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: