2013-12-12 95 views
1

所以我試圖編寫一個函數,將實施切線方法爲函數(f),將由用戶輸入並將每次迭代的結果添加到矢量。我收到一個錯誤,指出x是未定義的,這是可以理解的,但我不確定如何定義它。我試圖以f的參數可以是x的函數的方式編寫它,例如。 x^3 +12,而不是單獨的函數文件的名稱。Matlab - 用戶定義的函數作爲函數的參數

function [xans, xi, iter] = secant(f, x0, x1, tol) 

    k = 1; 
    a = x0; 
    b = x1; 
    c = f(b)*((b-a)/(f(b)-f(a))); 

    while abs(c) >= tol 
     xi(k) = b-c; 
     a = b 
     b = xi(k) 
     k = k+1; 

    end 
disp(x) 
disp(xi) 
disp(iter) 

回答

0

使用function_handle

[xans,xi,k] = secant(@myFunc,1,2,0.0001); 

此外,調用內循環功能可按,否則,它不更新:

function [xans, xi, k] = secant(f, x0, x1, tol) 

    %// etc. 

    while abs(c) >= tol 
     c = f(b) * (b-a)/(f(b)-f(a)); 
     %// etc. 
    end 
end 
+0

執行你的函數不應該'@'只有當函數被調用出現?我的意思是'[xans,xi,k] =正割(@sin,x0,x1,tol);'。 – pm89

+0

是的,我認爲問題中的原始語法是正確的,但函數句柄應發送到'secant'函數。 – pm89

+0

我在@f現在收到無效的語法錯誤,並且在運行程序時仍然收到錯誤「未定義函數或變量'x'」。爲了澄清,我希望f是x的一個函數,例如。 x^4 + 12x,而不是函數的名稱。 – ttl

2

你似乎有點困惑循環和在Matlab中起作用。你寫的函數不會更新循環內部的變量。當你寫

c = f(b) * (b-a)/(f(b) - f(a)); 

存儲在c一個值,但它不會自動每次經過循環時間更新c。相反,我會寫這樣的東西

function x1 = secant(f, x0, x1, tol) 

y1 = f(x1); 
y0 = f(x0); 
while abs(y1) > tol 
    tmp = x1;        %// Store the old value of x1 
    x1 = x1 - y1 * (x1 - x0)/(y1 - y0); %// Use the secant method to update x1 
    x0 = tmp;        %// x0 gets the old value of x1 
    y0 = y1;        %// We already know what f(x0) is 
    y1 = f(x1);       %// Need to re-compute f(x1) 
end 

然後你可以調用如下。第一個參數被稱爲函數句柄

>> secant(@(x)x^2-2, 0, 1, 1e-6) 
ans = 
    1.414213562057320 
0

>>secant(@(x) x^3 +12, x0, x1, tol)