Джулия: Получение функции путем суммирования по массиву функций

#function #julia

#функция #джулия

Вопрос:

У меня есть массив функций, и я хочу создать другую функцию, используя взвешенную сумму по этим функциям. Допустим, T=[T1, ..., T20] и T1(x,y)=x^2 5 , T2(x,y)=sin(x y) , …

Я хочу создать другую функцию с именем g(x,y)=10*T1(x,y) ... 32*T20(x,y) . коэффициенты могут меняться, поэтому я хочу использовать какой-то цикл, но я не смогла.

Ответ №1:

Это моя попытка, возможно, есть решение получше.

Если вы можете изменить сигнатуру g:

 g(x, y, weights, T) = sum(weights[i]*Ti(x,y) for (i,Ti) in enumerate(T))
  

Если вам нужна именно эта подпись g(x,y) , я предлагаю функцию-генератор:

 generate_g(weights, T) = (x,y) -> sum(weights[i]*Ti(x,y) for (i,Ti) in enumerate(T))
  

Вы передаете в нее веса, и она возвращает новую функцию, которая принимает x и y в качестве аргументов. Вот пример

 julia> T1(x,y)=x^2 5; T2(x,y)=sin(x y); T=[T1, T2];

julia>g = generate_g([10,11], T)
#3 (generic function with 1 method)

julia> g(1,2)
61.55232008865854
  

Когда веса меняются, вы можете сгенерировать новый g .

Комментарии:

1. Это хорошее решение и, вероятно, лучшее «простое» решение. Ее единственным ограничением является то, что она не является стабильной по типу, поскольку компилятор не знает возвращаемые типы Ti во время компиляции. Если производительность является проблемой, вы можете либо добавить аннотацию Ti(x,y) с ожидаемым типом возвращаемого значения, либо рассмотреть возможность написания макроса, который сгенерирует тело функции путем повторения итерации T .