Ошибка «Невозможно доказать буквально» при попытке создать символическую функцию на основе существующей функции - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно найти обратную функцию виртуального значения логнормальных случайных величин. Вот что я пытался сделать:

syms flogn(x,p1,p2)
% assume(p2<=0);             %Adding this doesn't change the error
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);
glogn = finverse(flogn,x);

Но я получил ошибку:

Error using symengine
Unable to prove 'p2 <= 0' literally. Use 'isAlways' to test the statement mathematically.

Error in sym/subsindex (line 810)
                X = find(mupadmex('symobj::logical',A.s,9)) - 1;

Error in sym/privsubsasgn (line 1085)
                L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);

Error in sym/subsasgn (line 922)
            C = privsubsasgn(L,R,inds{:});

Error in logncdf>locallogncdf (line 73)
sigma(sigma <= 0) = NaN;

Error in logncdf (line 47)
[varargout{1:max(1,nargout)}] = locallogncdf(uflag,x,varargin{:});

Error in Untitled5 (line 3)
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);

Я также пробовал с бета-дистрибутивом, и получил аналогичную ошибку. Как я могу использовать logncdf с символическими переменными?

1 Ответ

0 голосов
/ 20 ноября 2018

Обратите внимание, что вы могли бы свести к минимуму ваш пример кода еще больше, как это:

syms flogn(x,p1,p2)
flogn(x,p1,p2) = logncdf(x,p1,p2);

Это короче, выдает ту же ошибку и помогает нам сосредоточиться на источнике сообщения об ошибке.


Итак, ошибка возникает не из-за попытки инвертировать функцию, а из-за попытки использовать существующую функцию для численных расчетов с символическими переменными.

Ошибка возникает из-за того, что вы хотите создать символическую функцию flogn на основе существующей функции logncdf, а logncdf имеет несколько сравнений.

С помощью команды edit logncdf вы можете прочитать исходный код функции и увидеть сравнение в строках 73 и 76.

% Return NaN for out of range parameters.
sigma(sigma <= 0) = NaN;

% Negative data would create complex values, which erfc cannot handle.
x(x < 0) = 0;

Matlab не может сравнивать символы, поэтому он выдает ошибки.

В зависимости от того, что вам действительно нужно, у вас могут быть разные решения.

  • Вам действительно нужно символизировать функцию flogn? Не могли бы вы просто написать это как function, а затем вычислить обратное значение (если оно может быть инвертировано ...)?

  • Если вы действительно хотите сохранить символику, вы также можете переписать свою собственную функцию logncdf (с другим именем), чтобы она не имела сравнений. Но все еще не гарантируется, что вы найдете обратное.

...