Октава: вычислить градиент многомерной функции в определенной точке
Я пробовал следующий код, чтобы найти градиент функции в определенной точке, где на входе находится вектор, а функция возвращает скаляр.
Ниже приведена функция, для которой я пытаюсь вычислить градиент.
%fun.m
function [result] = fun(x, y)
result = x^2 + y^2;
Вот как я называю градиент.
f = @(x, y)fun(x, y);
grad = gradient(f, [1 2])
Но я получаю следующую ошибку
octave:23> gradient(f, [1 2])
error: `y' undefined near line 22 column 22
error: evaluating argument list element number 2
error: called from:
error: at line -1, column -1
error: /usr/share/octave/3.6.2/m/general/gradient.m at line 213, column 11
error: /usr/share/octave/3.6.2/m/general/gradient.m at line 77, column 38
Как мне решить эту ошибку?
1 ответ
Я думаю, что gradient
не может работать на 2D
функции ручки, таким образом, я сделал это. Рассмотрим следующий лямбда-ароматизатор:
Позволять fz
быть ручкой функции к какой-то вашей функции
fz = @(x,y)foo(x,y);
затем рассмотрите этот код
%% definition part:
only_x = @(f,yv) @(x) f(x,yv); %lambda-like stuff,
only_y = @(f,xv) @(y) f(xv,y); %only_x(f,yv) and only_y(f,xv) are
%themselves function handles
%Here you are:
gradient2 =@(f,x,y) [gradient(only_x(f,y),x),gradient(only_y(f,x),y)];
который вы используете в качестве
gradient2(fz,x,y);
Наконец небольшой тест:
fz = @(x,y) x.^2+y.^2
gradient2(f,1,2);
результат
octave:17> gradient2(fz,1,2)
ans =
2 4