fzero
需要一個單變量1D函數作爲其第一個參數,並且初始猜測爲第二個參數。您定義f(u)
並將其傳遞到fzero
的方式不正確:您定義常量函數f(u) = 0
,然後用新(遞歸)定義覆蓋該定義。您然後通過值f(u)
而不是函數f
到fzero
。
你可能想要的是以下幾點:
using Roots
function findroot(z, tau)
function f(u)
res = 0
for i = 1:3
res += max(abs(z[i]) - u, 0)
end
res -= tau
return res
end
fzero(f, 3)
end
首先,上面的代碼定義了一個函數f
(封閉)取決於z
和tau
從封閉環境(外部函數findroot
)。然後,函數f
和初始猜測被傳遞給fzero
。
我更喜歡在全局範圍內定義函數,並顯式傳遞參數作爲參數。較短的執行你的函數是:
f(u, z, tau) = sum(max(abs(zi) - u, 0) for zi in z) - tau
這樣,一個可以研究它的行爲,例如,通過繪製它針對不同的參數:
using Plots
plot(u->f(u, [0,1,2], 1), 0, 4)
語法args -> body
定義了一個匿名函數。然後可以使用相同的語法來定義findroot
:
findroot(z, tau) = fzero(u->f(u, z, tau), 0)
來源
2017-02-14 19:34:07
tim