필터 지우기
필터 지우기

Derive function handle with a vector input argument

조회 수: 4 (최근 30일)
Majeed
Majeed 2024년 1월 11일
댓글: Majeed 2024년 1월 12일
when I run this piece of code
q=[3 2 2 3];
f=@(p,x,y) p(1)*x.^2+p(2).*y.^2+p(3)*x.*y+p(4);
syms 'x'
df=diff(f,x);
dfdx=matlabFunction(df);
A=feval(f,q,2,2);
I get an error says
Index exceeds the number of array elements (1).
What I am trying to do is to cluster my equation coefficients into one vector to make my code compact. In my real application I have 15 coefficients. Any advice if this process is possible?

채택된 답변

Walter Roberson
Walter Roberson 2024년 1월 11일
이동: Walter Roberson 2024년 1월 11일
q=[3 2 2 3];
f=@(p,x,y) p(1)*x.^2+p(2).*y.^2+p(3)*x.*y+p(4);
syms p [1 4]
syms x y
df=diff(f(p,x,y),x)
df = 
dfdx = matlabFunction(df, 'vars', {p, x, y})
dfdx = function_handle with value:
@(in1,x,y)in1(:,1).*x.*2.0+in1(:,3).*y
A = feval(f,q,2,2)
A = 31

추가 답변 (2개)

Paul
Paul 2024년 1월 11일
편집: Paul 2024년 1월 11일
Hi Majeed,
Maybe you're looking for something like this?
q = [3 2 2 3];
p = sym('p',[1 4]);
syms x y
f = p(1)*x.^2+p(2).*y.^2+p(3)*x.*y+p(4)
f = 
df=diff(f,x)
df = 
A = subs(f,[p x y],[q,2,2])
A = 
31

Matt J
Matt J 2024년 1월 11일
편집: Matt J 2024년 1월 11일
If you have the Deep Learning Toolbox, you can do automatic differentiation of vector-valued dlarrays,
p=1:15;
x0=dlarray(rand(size(p)));
[fx,gradfx] = dlfeval(@(x) somefunc(x,p),x0)
fx =
1×1 dlarray 68.8215
gradfx =
1×15 dlarray 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
function [y,dydx]=somefunc(x,p)
y=p*x';
dydx=dlgradient(y,x);
end

카테고리

Help CenterFile Exchange에서 Numbers and Precision에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by