Undefined unary operator '.'' for input arguments of type 'function_handle'.
조회 수: 2 (최근 30일)
이전 댓글 표시
Hi,
I'm using matlab 2017b and want to find the gradient of a function with two arguments as defined in the mathwork site:
[FX,FY] = gradient(F) returns the x and y components of the two-dimensional numerical gradient of matrix F. The additional output FY corresponds to ∂F/∂y, which are the differences in the y (vertical) direction.
This is my code:
b=@(x,y) (x-1).^2+(x.^2+y).^2;
[dbdX,dbdY] = gradient(b)
The error I got is:
Undefined unary operator '.'' for input arguments of type 'function_handle'.
How do I solve this? Can somebody help me or give me a hint?
댓글 수: 0
채택된 답변
Robert U
2019년 11월 20일
편집: Robert U
2019년 11월 20일
Hi Clarisha Nijman,
your b is a function handle to the anonymous function with input arguments x and y. Gradient itself is - as stated in the documentation - the 2-D gradient of a matrix. In order to calculate the matrix you would have to create it.
b=@(x,y) (x-1).^2+(x.^2+y).^2;
[X,Y] = meshgrid(-100:1:100,-100:1:100);
[dbdX,dbdY] = gradient(b(X,Y));
Please, pay attention that gradient needs the grid having equidistant distribution and if spacing is not "one" you have to scale the result.
Using symbolic toolbox you can apply gradient to scalar functions, which would need you to change your function definition.
Kind regards,
Robert
댓글 수: 4
Robert U
2019년 11월 21일
편집: Robert U
2019년 11월 21일
Hi Clarisha Nijman,
you should check your analytical solution.
Chosen resolution has an influence on the numerically obtained result.
% define point to evaluate
xToEval = 1;
yToEval = 0;
% base function
b=@(x,y) (x-1).^2+(x.^2+y).^2;
% analytical solution
dbdXf=@(x,y) 2.*(x-1) + 4.*(x.^2+y).*x;
dbdYf=@(x,y) 2.*(x.^2 + y);
dbdXRef = dbdXf(xToEval,yToEval);
dbdYRef = dbdYf(xToEval,yToEval);
% resolution of grid
resGrid = 0.1;
% define grid
[X,Y] = meshgrid(xToEval-1:resGrid:xToEval+1,yToEval-1:resGrid:yToEval+1);
% gradient on grid
[dbdX,dbdY] = gradient(b(X,Y),resGrid,resGrid);
% point of interest is in the center of the result matrix
dbdX = dbdX((size(X,1)+1)/2,(size(X,1)+1)/2);
dbdY = dbdY((size(Y,1)+1)/2,(size(Y,1)+1)/2);
Kind regards,
Robert
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Calculus에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!