0

次の問題があります。ベクトルである関数ハンドルを作成しようとしています。特に、私はこのようなものを持っています

    EQ0 = @(W) m1.^2*(exp(W))-m2.^2

ここで、m1 と m2 は同じ次元のベクトルです。したがって、各 m1(i) および m2(i) に対して、ハンドル W(i) が必要です。次のステップで fsolve を使用して、次のような W(i) を見つけるために必要です。

    n=size(m1)        
    x0 = zeros(n);
    Wbar = fsolve(EQ0,x0)

arrayfun を使用してみましたが、次のエラーが発生しました

   EQ0 = arrayfun( @(W) m1.^2*(exp(W))-m2.^2, m1=m1e, m2=m2e)
   Error: The expression to the left of the equals sign is not a valid target for an assignment.

arrayfun を使用する別の試みは、これをもたらしました (ここでは、前のケースのように入力としてではなく、m1 および m2 ベクトルを直接使用しました)

    EQ0 = arrayfun( @(W) m1.^2*(exp(W))-m2.^2,:)
    Undefined variable arrayfun.

私は明らかに何かが欠けています。arrayfun のいくつかのフィードを調べましたが、私の問題は多少異なるようです。

アドバイスをいただければ幸いです。

4

1 に答える 1

0

したがって、あなたが正しいことを理解していれば、m1(i) または m2(i) ごとに、次の方法でベクトル W を操作できる別の関数ハンドル EQ0(i) が必要です。 EQ0(i) = @(W) m1 (i)^2*(exp(W))-m2(i)^2. これは正しいです?その場合、各次元に関数ハンドルを持つ m1 と同じ次元のセル配列を作成できます。

EQ0 = cell(size(m1));
for ii = 1:numel(m1)
   EQ0(ii) = {@(W) m1(ii)^2*exp(W)-m2(ii)^2};
end

編集:別のオプションは次のとおりです。

EQ0 = @(W)arrayfun(@(Wel,m1el,m2el)m1el^2*exp(Wel)-m2el^2,W,m1,m2);
fsolve(EQ0, W_Values)

ここで、m1、m2 はあらかじめ定義しておく必要があります。それ以外の場合は、最初の無名関数の引数としてそれらを追加する必要があります。そのため、 arrayfun の最初の引数に渡した無名関数ハンドルによって定義されarrayfun(@(Wel, m1el, m2el)..., W, m1, m2)たエントリの要素ごとの計算を呼び出すことによって実行します。しかし、毎回異なるW, m1, m2定義をしたいので、その arrayfun コマンドの無名関数を作成します。これは引数として受け取ります。WW

于 2016-07-06T22:53:24.137 に答える