MATLAB: использование анонимной функции в symsum, затем fsolve

В 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'.

Любой совет был бы очень признателен.


person monkey-dart    schedule 30.03.2016    source источник
comment
Есть ли причина использовать символьную математику? Используйте сумму вместо символа   -  person Daniel    schedule 30.03.2016
comment
Арх! Ты прав. Это легко решает проблему: fun = @(x) 0.5-sum(Finv([1:n+1]*x)); Спасибо.   -  person monkey-dart    schedule 30.03.2016


Ответы (1)


Попробуйте принудительно указать вторую переменную (например, j) как символьную переменную со скалярным (числовым) типом данных. Обратите внимание в его коде, что только переменная не инициализируется.

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

Кроме того, вы можете проверить предположения по каждой переменной. Например,

assumptions(j)
person e2a    schedule 30.03.2016