В MATLAB я хочу определить анонимную функцию, в которой есть определенная сумма, и еще одну анонимную функцию в ней. Вот MWE, который, надеюсь, описывает то, что я пытаюсь сделать:
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 (строка 45) y.vars = validateArgNames(inputs);
Ошибка в sym/subsasgn (строка 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
я решил это, используя eval
и feval
следующим образом:
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=@(x) logninv(x,a,b)
, но это противоречит сути, которая заключается в том, что я хочу иметь возможность определить Finv
как одномерную функцию по моему выбору, а не обязательно предопределенное выражение MuPAD, такое как 'logninv'
.
Любой совет был бы очень признателен.
fun = @(x) 0.5-sum(Finv([1:n+1]*x));
Спасибо. - person monkey-dart   schedule 30.03.2016