Функция `fzero` в matlab не может найти root и продолжает генерировать ошибку - PullRequest
0 голосов
/ 26 марта 2020

Я использую MATLAB и хочу найти root уравнения F (x) -u = 0. Здесь u=0.2861 и

F=normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1)).

Значения lambda и mu равны 1.

Я набрал следующий код

[x,fval] = fzero(@(t) normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1))-u, 10);

и надеюсь это может помочь мне найти root. Я могу математически показать, что это уравнение имеет уникальный root. Тем не менее, я продолжаю получать следующую ошибку

Ошибка при использовании erfc Ввод должен быть действительным и полным.

Ошибка в normcdf> localnormcdf (строка 128) p(todo) = 0.5 * erfc(-z ./ sqrt(2));

Ошибка в normcdf (строка 50) [varargout{1:max(1,nargout)}] = localnormcdf(uflag,x,varargin{:});

Ошибка в Test> @(t)normcdf(sqrt(lambda/t)*(t/mu-1))+exp(2*lambda/mu)*normcdf(-sqrt(lambda/t)*(t/mu+1))-u

Ошибка в fzero (строка 363) a = x - dx; fa = FunFcn(a,varargin{:});

Затем я применил метод "брутальной силы".

t = [0:0.001:20];
F = normcdf(sqrt(lambda./t).*(t/mu-1))+exp(2*lambda/mu).*normcdf(-sqrt(lambda./t).*(t/mu+1))-u;
plot(t,F)

Я ясно вижу, что F(t)-u увеличивается в t и root составляет около 0,4. У меня вопрос, почему fzero не работает в этом случае и есть ли способ заставить fzero работать?

1 Ответ

1 голос
/ 26 марта 2020

Проблема в том, что функция не меняет знак, что необходимо, поскольку документы говорят:

x = fzero(fun,x0) пытается найти точку x, где fun(x) = 0. В этом решении fun(x) меняет знак - fzero не может найти root функции, такой как x^2.

Я разбил ваш код, чтобы сделать его немного более понятным (в хотя бы для меня).

lambda = 1;
mu = 1;
u = 1;

% break up function code
arg1 = @(t) +sqrt(lambda./t).*(t./mu-1);
arg2 = @(t) -sqrt(lambda./t).*(t./mu+1);
fnc = @(t) normcdf(arg1(t))+exp(2*lambda/mu).*normcdf(arg2(t))-u;
% call fzero to find the root
% [x,fval] = fzero(fnc, 10);

% plot
x = 0:0.01:10;
plot(x,fnc(x))

Функция не определена для любого входа t <0 из-за <code>sqrt в дескрипторе моей функции arg. Поэтому, если вы построите график для значений t> 0, вы увидите, что он никогда не пропускает ноль.

EDITED: знак перепутывания в аргументах. Thx flxx за указание на это. Сюжет и код обновлены. Аргумент остается в силе.

fnc(t)

...