2016-03-30 2 views
0

In MATLAB möchte ich eine anonyme Funktion, die eine bestimmte Summe enthält, und eine andere anonyme Funktion darin definieren. Hier ist ein MWE die hoffentlich beschreibt, was ich zu tun versucht:MATLAB: Verwenden Sie eine anonyme Funktion innerhalb von symsum, dann 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) 

Der Fehler zurückgegeben:

Fehler symfun mit> validateArgNames (Linie 211) Zweiter Eingang muss ein Skalar oder Vektor eindeutige symbolische Variablen.

Fehler in Symfun (Zeile 45) y.vars = validateArgNames (Eingaben);

Fehler in sym/subsasgn (Zeile 762) C = symfun (B, [inds {:}]);

Fehler in logninv (Zeile 60) p (p < 0 | 1 < p) = NaN;

Fehler in @ (x) logninv (x, a, b)

Fehler in @ (x) 0,5-symsum (Finv (j * x), j, 1, n + 1)

Fehler in fsolve (Zeile 217) fuser = feval (funfcn {3}, x, varargin {:});

Ursache: Fehler bei der ersten vom Benutzer gelieferten objektiven Funktionsbewertung. FSOLVE kann nicht fortsetzen.

Für diese besondere Auswahl an Finv Ich löste es eval und feval wie folgt verwendet:

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) 

, die die Antwort in diesem speziellen Fall erzeugt, weil [email protected](x) logninv(x,a,b), aber den Punkt besiegt, die das I möchte Finv als univariate Funktion meiner Wahl definieren können, nicht unbedingt einen vordefinierten MuPAD-Ausdruck wie 'logninv'.

Jeder Rat würde am meisten geschätzt werden.

+0

Gibt es einen Grund, symbolische Mathematik zu verwenden? Verwenden Sie statt Summe Summe statt – Daniel

+0

Argh! Du hast recht. Dies löst es leicht: 'Spaß = @ (x) 0,5-Summe (Finv ([1: n + 1] * x));' Danke. – dwarf102

Antwort

0

Versuchen Sie, die zweite Variable (d. H. J) als eine symbolische Variable mit einem skalaren (numerischen) Datentyp zu erzwingen. Hinweis in seinem Code, das ist nur Variable wird nicht initialisiert.

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

Alternativ können Sie die Annahmen für jede Variable überprüfen. Zum Beispiel

assumptions(j) 
Verwandte Themen