fzero
принимает дескриптор функции в качестве первого ввода. Как у вас сейчас есть, вы пытаетесь передать оператор в качестве первого ввода. Этот оператор даже не может быть правильно оценен, потому что вы пытаетесь выполнить числовые операции с дескриптором функции (подробнее об этом чуть позже).
Вместо этого вам нужно сделать нечто подобное: мы создадим новый дескриптор функции, который оценивает исходный дескриптор функции и выполняет другие необходимые вам операции.
S1(a) = fzero(@(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))),lambda0);
Дальнейшее объяснение
Выполнение операций над дескриптором функции отличается от выполнения их над результатом.
Так, например, если бы у нас был дескриптор функции:
func = @(x)2*x;
Если мы оценим это, вызвав его с входным значением для x
func(2)
4
Это работает так, как мы и ожидали. Если теперь нам действительно нужно значение (2*x)^2
, мы могли бы попытаться написать его так, как вы написали свое утверждение в своем вопросе.
func2 = func^2;
Мы получим ошибку!
Неопределенный оператор '^' для входных аргументов типа 'function_handle'.
Это не работает, потому что MATLAB пытается применить операцию ^
к самому дескриптору функции, а не к значению оцениваемого дескриптора функции.
Вместо этого нам нужно создать новый дескриптор функции, который по сути является оболочкой другого и выполняет любые дополнительные параметры:
func2 = @(x)func(x)^2;
func2(2)
16
Полный круг
Итак, если мы вернемся к вашему вопросу, вы определили свою анонимную функцию r1
следующим образом.
r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data
Все это выглядит великолепно. У вас есть один входной аргумент, и вы ссылаетесь на r
и b
из родительской рабочей области.
Теперь, когда вы вызываете fzero
, вы пытаетесь выполнить операции с этим дескриптором функции в надежде создать новый дескриптор функции.
mean((r - b)*r1.^(1/(a - 1)))
Как мы только что показали, это приведет к очень похожей ошибке.
Неопределенный оператор .^ для входных аргументов типа 'function_handle'
Поэтому нам нужно обернуть это в новую функцию.
newfunc = @(lambda)mean((r - b)*r1(lambda).^(1 / (a - 1)));
Теперь мы можем безопасно передать это fzero
.
result = fzero(newfunc, lambda0);
person
Suever
schedule
18.03.2016