3

入力がベクトルで、関数がスカラーを返す特定のポイントで関数の勾配を見つけるために、次のコードを試しています。

以下は、勾配を計算しようとしている関数です。

%fun.m    
function [result] = fun(x, y)
     result = x^2 + y^2;

これが私がグラデーションと呼ぶ方法です。

f = @(x, y)fun(x, y);
grad = gradient(f, [1 2])

しかし、次のエラーが表示されます

octave:23> gradient(f, [1 2])
error: `y' undefined near line 22 column 22
error: evaluating argument list element number 2
error: called from:
error:    at line -1, column -1
error:   /usr/share/octave/3.6.2/m/general/gradient.m at line 213, column 11
error:   /usr/share/octave/3.6.2/m/general/gradient.m at line 77, column 38

このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

2

私の推測では、関数ハンドルでは機能gradientしないため2D、これを作成しました。次のラムダ フレーバーソリューションを検討してください。

fzあなたの関数の関数ハンドルにしましょう

fz = @(x,y)foo(x,y);

次に、このコードを検討してください

%% definition part:
only_x = @(f,yv) @(x) f(x,yv);  %lambda-like stuff, 
only_y = @(f,xv) @(y) f(xv,y);  %only_x(f,yv) and only_y(f,xv) are
                                %themselves function handles

%Here you are:
gradient2 =@(f,x,y) [gradient(only_x(f,y),x),gradient(only_y(f,x),y)];  

あなたがとして使用するもの

gradient2(fz,x,y);   

最後にちょっとしたテスト:

fz = @(x,y) x.^2+y.^2
gradient2(f,1,2);

結果

octave:17> gradient2(fz,1,2)
ans =

    2   4
于 2012-10-31T15:35:00.893 に答える