2016-04-11 41 views
0

私はMATLABでhelp gmresを入力すると、私は次の例取得パラメータ:私がテストしMATLAB関数ハンドルと

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 

:二つの機能がある

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

をそれは素晴らしい作品です。私の質問は、両方の機能ではxの値は何であるのですか?

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

私はこれはかなりよく文書によって説明されると思う:

は何が起こるかを説明するために、次の例を考えてみましょう。具体的には、[関数ハンドル](http://se.mathworks.com/help/matlab/function-handles.html)と[パラメータ関数](http://se.mathworks.com/help/matlab)を参照してください。 /math/parameterizing-functions.html)。 – mikkola

+0

私はこれらのすべてを読んだことがあります。私の質問は答えられません。もしあなたが私の質問を読んだら、多分あなたはそれに答えることができる。 – System

答えて

1

関数ハンドルは、MATLABでparametrize functionsに一つの方法です(@handleでy):

はまたgmresへの呼び出しは次のように書かれるべきではありません。ドキュメントページから、我々は次の例を見つける:

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

x = 
    -1.0945 

それでは、ここで起きているのでしょうか? fzeroは、いわゆるファンクション関数であり、ファンクションハンドルを入力として受け取り、そのファンクションハンドルを操作します。この場合は、指定された関数のルートが検索されます。実際には、fzeroは、入力引数xcubicpolyのどの値をルートを見つけるために試行するかを決定することを意味します。これは、ユーザーが関数を提供するだけで、入力を与える必要がないことを意味します。fzeroは、xの異なる値で関数を照会し、最終的にルートを検索します。

お問い合わせいただいた機能は、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. 
+0

あなたの答えをありがとう。私はドキュメントのページでこの例を読んだが、fzeroが適切なxを見つけたのを見た。私はgmresが同じように動作したことを認識しませんでした。したがって、xを指定する必要はありません.gmresとfzeroはそのように動作しますか?あなたの例のような関数の場合、常にxに値を与えなければなりません。 – System

+0

簡単に言えば、関数ハンドルには変数の独自の作業領域があります。入力パラメータリストを介して入力されていないものは、関数ハンドルが作成された時点で既知でなければならず、ハンドルが定義されているワークスペースから取得されます。これにより、たとえば次のことが可能になります。 'y = 1; f = @(x)2 * x + y'は、入力xを使用する単一入力関数を持つだけでなく、定数パラメータyが持つべき値も知っています。もちろん、2つの関数は多少異なるものですが、ハンドルを使う方法は概念的に同じです。つまり、ユーザーは入力を与えず、関数はそれを決定します。 – mikkola