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

2 views (last 30 days)
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

Accepted Answer

James Tursa
James Tursa on 20 Apr 2023
Edited: James Tursa on 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

More Answers (0)

Categories

Find more on Symbolic Math Toolbox in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!