あなたが達成しようとしていることを完全には理解していないことを認めますが、sum
事前計算した変化する値を持つ無名関数の関数ハンドルを作成しようとしているようです。MATLAB の無名関数を使用すると、これを行うことができます。
ここでは、無名関数との混乱があるようです。まず、次の行:
c = @(x)constraints;
c
本当に関数ハンドルになりたい場合を除き、おそらく何か別のものであるはずです。行頭の@
は、既存の関数を呼び出したいだけだと思うときに、新しい無名関数を宣言しますconstraints
。あなたは本当にc
制約関数から来る制約の配列になりたいようです。その場合、私はあなたが言うつもりだと思います
c = constraints(x);
次に、和を求めますが、ベクトルとして求めるか、単一の和として求めるかはわかりません。まず、'sum' という名前は付けないようにしましょう。これは組み込みの MATLAB 関数の名前だからです。それを「サムバル」と呼びましょう。値が 1 つだけの場合は簡単です (どちらの方法も簡単ですが、これを実行してみましょう) for ループの前に開始しsumval=0;
て初期化すると、ループは次のようになります。
sumval = 0;
for i = 1:length(c)
sumval = sumval + (min(c(i),0))^2);
end
必要に応じて、4 行すべてをベクトル化できます。
c(c>0) = 0; %Replace all positive values with 0
sumval = sum(c.^2); % Use .^ to do a element by element square.
最後の行は明らかに実際の関数ハンドルを作成する場所ですが、ここで何が必要かはまだよくわかりません。が関数の場合sig
は、おそらく次のようにするつもりでした:
penFunc = @(x)(funcHandle(x) + sig*sumval);
確信はないけど。sum をベクトルにしたい場合は、ここで指定した方法ではうまくいきません。
実際には、penFunc をその中に変数を持つ無名関数 (つまり、sumval) にすることは問題ありませんが、関数ハンドル宣言の時点で存在していた sumval の値を引き続き使用することに注意してください。
したがって、実際の問題は、A) c の作成です。これは、関数ハンドルを意図したものではないと思います。B) sum の初期化です。これは、おそらく sumval にする必要があります (MATLAB 自体の関数と対話しないため)。おそらく新しい関数ハンドルを宣言すべきではありません。