所以我正在尝试编写一个函数,该函数将把secant方法实现到一个函数(f),该函数将由用户输入并将每次迭代的结果添加到向量中。我得到一个错误,声明x未定义,这是可以理解的,但我不确定如何定义它。我试图以一种方式来编写它,其中参数f可以是x的函数,例如。 x ^ 3 +12,而不是单独的函数文件的名称。
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 :(得分: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
答案 1 :(得分:0)
[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
答案 2 :(得分:0)
使用>>secant(@(x) x^3 +12, x0, x1, tol)