2013-12-12 81 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)