当我在MATLAB中输入help gmres
时,我得到以下示例:
n = 21; A = gallery('wilk',n); b = sum(A,2);
tol = 1e-12; maxit = 15;
x1 = gmres(@(x)afun(x,n),b,10,tol,maxit,@(x)mfun(x,n));
这两个函数是:
function y = afun(x,n)
y = [0; x(1:n-1)] + [((n-1)/2:-1:0)'; (1:(n-1)/2)'].*x+[x(2:n); 0];
end
和
function y = mfun(r,n)
y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)'];
end
我测试了它,效果很好。我的问题是,在这两个函数中,x
的价值是什么,因为我们从不给它一个?
也不应该像gmres
一样写这样的话:( y
在@handle中
x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));
答案 0 :(得分:1)
函数句柄是MATLAB中parametrize functions的一种方法。在文档页面中,我们找到以下示例:
b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)
导致:
x =
-1.0945
那么这里发生了什么? fzero
是一个所谓的函数函数,它将函数句柄作为输入,并对它们执行操作 - 在这种情况下,查找给定函数的根。实际上,这意味着fzero
决定输入参数x
到cubicpoly
的哪些值,以便找到根。这意味着用户只需提供一个函数 - 无需提供输入 - 而fzero
将使用x
的不同值查询函数,以最终找到根。
您询问的功能gmres
以类似的方式运作。这意味着你只需要提供一个带有适当数量的输入参数的函数,gmres
将负责用适当的输入调用它来产生它的输出。
最后,让我们考虑一下如下调用gmres
的建议:
x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));
这可能会起作用,或者可能不会起作用 - 这取决于您是否在函数的工作空间中有一个名为x
的变量,最终调用afun
或mfun
。请注意,现在函数句柄接受一个输入y
,但其值在所定义函数的表达式中没有使用。这意味着它不会对输出产生任何影响。
请考虑以下示例来说明会发生什么:
f = @(y)2*x+1; % define a function handle
f(1) % error! Undefined function or variable 'x'!
% the following this works, and g will now use x from the workspace
x = 42;
g = @(y)2*x+1; % define a function handle that knows about x
g(1)
g(2)
g(3) % ...but the result will be independent of y as it's not used.