0

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));

ここで、2 つの関数は次のとおりです。

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));
4

1 に答える 1

1

関数ハンドルは、MATLAB で関数をパラメーター化する1 つの方法です。ドキュメントページから、次の例を見つけます。

b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)

結果は次のとおりです。

x =
   -1.0945

ここで何が起こっているのでしょうか?fzeroいわゆる関数 functionで、関数ハンドルを入力として取り、それらに対して操作を実行します。この場合、指定された関数のルートを見つけます。実際には、これは、ルートを見つけるために試行する入力fzero引数の値を決定することを意味します。これは、ユーザーが関数を提供するだけであり、入力を与える必要がなく、最終的にルートを見つけるために異なる値で関数をクエリすることを意味します。xcubicpolyfzerox

あなたが尋ねる関数gmresは、同様の方法で動作します。これが意味することは、適切な数の入力引数を受け取る関数を提供するだけでよく、適切な入力で関数をgmres呼び出して出力を生成する必要があるということです。

gmres最後に、次のように呼び出すというあなたの提案を考えてみましょう。

x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));

これはうまくいくかもしれませんし、うまくいかないかもしれません - それはx、関数のワークスペースで呼び出された変数が最終的に または のいずれafunかを呼び出すかどうかによって異なりますmfun。関数ハンドルは 1 つの入力を受け取るようになり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.
于 2016-04-11T18:57:52.797 に答える