eval() is too slow to numerically evaluate a function with X(t) and Y(t).

4 Ansichten (letzte 30 Tage)
Hello,
I have a symbolic vector function, Vfun, that depends of two symbolic variables, X(t) and Y(t).
I want to evaluate Vfun for a series of numerical values for X and Y. Here's what I've tried. It works, but it's quite slow.
%% SETUP
syms X(t) Y(t) % (here the "(t)" isn't very relevant, but, I'll need to be able to use diff(Vfun,t) later on)
Vfun = [2*X + Y ; cos(X)*X^2 + Y^3 ; 3 + sin(Y)]; % (actually generated by an algorithm I can't change)
N = 40000;
Xnum = rand(1,N);
Ynum = rand(1,N);
%% TRYING TO EVALUATE Vfun WITH Xnum AND Ynum
tic
Mresults = zeros(3,N);
for j = 1:N
X = Xnum(j);
Y = Ynum(j);
Mresults(:,j) = subs(Vfun);
end
toc
I suspect the problem lies in the subs() function.
I've tried to use matlabFunction(), but it doesn't work and I don't know how to remove the "(t)"
Any ideas? I doesn't need to be ultra-fast, just something more reasonable.
Thank you in advance

Akzeptierte Antwort

James Tursa
James Tursa am 20 Apr. 2023
Bearbeitet: James Tursa am 20 Apr. 2023
Something like this?
syms X(t) Y(t)
Vfun = [2*X + Y ; cos(X)*X^2 + Y^3 ; 3 + sin(Y)]
Vfun(t) = 
syms x y
vfun = subs(Vfun,[X Y],[x y])
vfun(t) = 
f = str2func(['@(x,y)' vectorize(char(vfun))]) % explicit code with no t
f = function_handle with value:
@(x,y)[2.*x+y;x.^2.*cos(x)+y.^3;sin(y)+3]
g = matlabFunction(vfun(0)) % using matlabFunction( ) with arbitrary t=0
g = function_handle with value:
@(x,y)[x.*2.0+y;x.^2.*cos(x)+y.^3;sin(y)+3.0]
N = 40000;
Xnum = rand(1,N);
Ynum = rand(1,N);
fnum = f(Xnum,Ynum);
gnum = g(Xnum,Ynum);
isequal(fnum,gnum)
ans = logical
1

Weitere Antworten (0)

Kategorien

Mehr zu Symbolic Math Toolbox finden Sie in Help Center und File Exchange

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by