2016-02-11 69 views
0

为了执行使用正常的变量可以做如下函数评估:更高效的符号函数评估

f = @(x)x.^2+3*x-5; 
x0 = -10:0.01:10; 
p = f(x0); 

但是用符号变量时,效率急剧下降。例如:

f = @(x)x.^2+3*x-5; 
x0 = -10:0.001:10; 

% using real values 
tic;p = f(x0);toc 

% using symbolic math 
syms x;tic;P = double(subs(f,x,x0));toc 


Elapsed time is 0.000686 seconds. 
Elapsed time is 10.867689 seconds. 

是否有同时使用符号来提高速度的方法吗?

+0

符号变量的大小顺序比实值变量慢(即匿名函数),这就是事实。所以恐怕没有什么办法可以显着提高速度:/ – Alessiox

+0

如果数值计算是最终目标,那么我会在其附近保留一个额外的变量,该变量包含用于数字运算的'f'的'matlabFunction'版本。 – TroyHaskin

回答

1

在这种情况下,从浮动转换为双倍会导致性能下降。切勿从浮点数学开始(x0 = -10:0.01:10;)并继续使用符号数学。

x0=sym(-10):sym(.001):sym(10); 
P=double(f(x0)); 
+0

这似乎没有规模好转。对于'x0 = -10:0.001:10;',就像OP的第二个例子,几乎没有任何区别(R2015b)。 – horchler

+0

@horchler:使用Matlab R2013a,我获得了更好的性能。原始代码为2s,修改后为1/3s。 – Daniel

+0

谢谢你的回答。在我的机器上,需要更多的时间来执行'已用时间为11.070485秒。'原因是你在问题中使用'0.01'而不是'0.001'。 ;) – NKN