您可以将函数包装到某种 Function-Factory 中,它不返回数值结果,而是返回可以计算的函数:
(我不得不更换电话syms
with sym('mu')
,因为由于某种原因它不断调用mutools
函数内联omega = ...
。我也将通话更改为gradient
确保参数的顺序正确,并且mu
将被视为常数。)
function GradOmega = GradOmegaFactory()
x = sym('x');
y = sym('y');
z = sym('z');
mu = sym('mu');
omega = 0.5*(x^2+y^2+z^2) + (1-mu)/((x+mu)^2+y^2+z^2)^0.5 + mu/((x+mu-1)^2+y^2+z^2)^0.5;
symGradient = gradient(omega,{'x','y','z'});
GradOmega = matlabFunction(symGradient, 'vars', {'x','y','z','mu'});
end
然后你可以通过以下方式调用它:
GradOmega = GradOmegaFactory();
result1 = GradOmega(numX1, numY1, numZ1, numMu1);
result2 = GradOmega(numX2, numY2, numZ2, numMu2);
result3 = GradOmega(numX3, numY3, numZ3, numMu3);
...
更好的是:
您可以更花哨并使用包装函数GradOmega
它在内部构建了这样一个函数并使其persistent
,以获得与最初方法相同的界面。第一次调用该函数时GradOmega
符号表达式被计算,但在每次连续调用时,您只需计算生成的函数句柄,这意味着它应该几乎与硬编码一样快。
function result = GradOmega(numX, numY, numZ, numMu)
persistent numericalGradOmega;
if isempty(numericalGradOmega)
numericalGradOmega = GradOmegaFactory();
end
result = numericalGradOmega(numX, numY, numZ, numMu);
end
像使用原始版本一样使用它
result = GradOmega(numX, numY, numZ, numMu);
只需将这两个函数复制并粘贴到一个函数中即可GradOmega.m
file. (GradOmega
应该是文件中的第一个函数。)
另一个提示:您甚至可以使用向量来评估该函数。而不是打电话GradOmega(1,2,3,4)
and GradOmega(5,6,7,8)
之后,您可以通过调用节省时间开销GradOmega([1,5], [2,6], [3,7], [4,8])
使用行向量。
另一个提示:要进一步清理代码,您还可以将第一行放入单独的代码中symOmega.m
file.
function omega = symOmega()
x = sym('x');
y = sym('y');
z = sym('z');
mu = sym('mu');
omega = 0.5*(x^2+y^2+z^2) + (1-mu)/((x+mu)^2+y^2+z^2)^0.5 + mu/((x+mu-1)^2+y^2+z^2)^0.5;
这样,您就不必在使用的每个文件中都拥有该符号表达式的副本。如果您也想评估,这可能会很有帮助Omega
本身,因为您可以使用此答案中列出的相同工厂方法。您最终会得到以下文件:symOmega.m
, Omega.m
and GradOmega.m
,其中只有文件symOmega.m
有实际的数学公式,其他两个文件利用symOmega.m
.