问题
我试图象征性地区分一个函数相对于两个不同的变量,然后为每个衍生物创建一个函数文件。其中一个函数文件有效,另一个没有,因为matlabFunction
错误处理了集成变量。
我的方法
生成函数文件的代码(启动函数是(非正则化)不完全beta函数)
syms x y a b fnc dFncda dFncdb
assume (a > 1);
assume (b > 1);
assume (0 < x & x < 1);
fnc(x,a,b) = int(y^(a-1)*(1-y)^(b-1),y,0,x);
dFncda(x,a,b) = diff(fnc(x,a,b),a,1);
dFncdb(x,a,b) = diff(fnc(x,a,b),b,1);
matlabFunction(dFncda(x,a,b),'File','derivA');
matlabFunction(dFncdb(x,a,b),'File','derivB');
结果
生成的derivA.m文件(不包括自动生成的注释)
function out1 = derivA(a,b,x)
out1 = integral(@(y)y.^(a-1.0).*log(y).*(-y+1.0).^(b-1.0),0.0,x);
从命令
进行测试derivA(0.5,3,3)
ans =
-1.7590
接下来,对于derivB.m
也是如此function out1 = derivB(a,b,x)
t2 = -y+1.0;
out1 = integral(@(y)t2.^(b-1.0).*y.^(a-1.0).*log(t2),0.0,x);
包含集成变量的被积函数的一部分已分配给t2
。由于未在后续匿名函数之外定义集成变量,因此不出所料导致错误
derivB(0.5,3,3)
Undefined function or variable 'y'.
Error in derivB
t2 = -y+1.0;
问题
我可以做些不同的事情来防止这种情况(除了我自己编写函数文件之外)吗?这是matlabFunction
处理积分的方式中的错误吗?我正在使用版本'9.2.0.556344(R2017a)'
答案 0 :(得分:2)
您可以使用'optimize'
标志强制MATLAB不优化您的功能。
matlabFunction(dFncdb(x,a,b),'File','derivB','optimize',false);
&#39; derivB.m&#39;的内容没有自动生成的注释现在与在您创建的衍生函数上使用disp(dFuncdb)
的公式相同:
function out1 = derivB(a,b,x)
out1 = int(y.^(a-1.0).*log(-y+1.0).*(-y+1.0).^(b-1.0),y,0.0,x);
有关文档,请参阅here。
在这种情况下,&#39;优化&#39;意味着打破这个功能&#39;!所以是的,当'optimize'
设置为true
时(这是默认设置),这看起来像是错误/意外行为。