2016-03-30 29 views
0

MATLABでは、明確な合計を持つ無名関数とその中の別の無名関数を定義したいと思います。ここでうまくいけば、私がやろうとしていますについて説明しMWEです:MATLAB:symsum内で匿名関数を使用する場合、fsolve

clear; n=1; syms j; a=0; b=sqrt(0.5); 
Finv = @(x) logninv(x,a,b); 
fun = @(x) 0.5-symsum(Finv(j*x), j, 1, n+1); 
fsolve(fun,0.1) 

エラーが返さは、次のとおりです。第二の入力はの スカラーまたはベクトルでなければなりませんsymfun> validateArgNames(ライン211)を使用して

エラー一意の記号変数。

symfun(line 45)のエラー y.vars = validateArgNames(inputs);

sym/subsasgn(line 762)のエラー C = symfun(B、[inds {:}]);

logninv(行60)のエラーp(p < 0 | 1 < p)= NaN; @(X)logninvで

エラー(X、a、b)は@に

エラー(X)0.5 symsum(FINV(jは* x)から、J、1、N + 1)

fsolve(行217)のエラー fuser = feval(funfcn {3}、x、varargin {:});

原因: 初期のユーザー指定の目的関数の評価に失敗しました。 FSOLVEは を続行できません。 Finvのこの特定の選択のために

私は次のようにevalfevalを使用して、それを解く:

[email protected](x) logninv(x,a,b)ので、この特殊なケースで答えを生成するが、これはということが私である点、敗北
clear; n=1; syms j; a=0; b=sqrt(0.5); 
Finv = @(x) logninv(x,a,b); 
fun = @(x) 0.5-eval(symsum(feval(symengine,'logninv',j*x,a,b), j, 1, n+1)); 
fsolve(fun,0.1) 

私の選択の単変量関数としてFinvを定義することができるようにしたいと思います。'logninv'のようなあらかじめ定義されたMuPAD式である必要はありません。

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

+0

記号演算を使用する理由はありますか? symsumの代わりにsumを使用してください – Daniel

+0

Argh!あなたが正しいです。これは簡単に解決します: 'fun = @(x)0.5-sum(Finv([1:n + 1] * x));'ありがとう。 – dwarf102

答えて

0

第2の変数(すなわち、j)を、スカラー(数値)データ型の記号変数として強制してください。彼のコードでは、変数のみが初期化されていないことに注意してください。

clear; n=1; syms j integer; a=0; b=sqrt(0.5); 

また、各変数の前提条件を確認することもできます。たとえば、

assumptions(j) 
関連する問題