2017-02-14 47 views
2

假設我有以下問題如何使用朱莉婭找到根(1-d的情況下)

enter image description here

使其更簡單:

  1. N = 3
  2. Z1 = 1; z2 = 2; z3 = 3
  3. \ tau = 1
  4. u是1D中的變量。

目標:解決F(U)= 0。

注意:假設我有寫在上面的函數。


以下是我的工作:enter image description here

我的問題是:

  1. 它看起來是否正確?
  2. $ u $是根,如果我不知道我的根先驗,我怎麼做「max()」?
  3. 由於我使用fzero(),所以我必須首先估計根的位置;否則,我必須給出一個範圍並使用fzeros(f,a,b)。正確?

回答

4

fzero需要一個單變量1D函數作爲其第一個參數,並且初始猜測爲第二個參數。您定義f(u)並將其傳遞到fzero的方式不正確:您定義常量函數f(u) = 0,然後用新(遞歸)定義覆蓋該定義。您然後通過f(u)而不是函數ffzero

你可能想要的是以下幾點:

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(封閉)取決於ztau從封閉環境(外部函數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)