Symbolic matlabFunction() generates a non-working function for my problem

I want to convert the symbolic expression to a MATLAB function, but the result of matlabFunction() leads to a non-working function with an unspecified parameter t:
syms t real
l = [0;0;t]
syms x y z real
r = [x;y;z];
sep = r-l
dl = diff(l,t)
integrand = simplify(cross(dl,sep)./norm(sep).^3,"Steps",100)
Bsym = int(integrand,t,[0 Inf])
fcn = matlabFunction(Bsym,'File','fcn1');
I received:
function Bsym = fcn1(x,y,z)
%FCN1
% Bsym = FCN1(X,Y,Z)
% This function was generated by the Symbolic Math Toolbox version 25.2.
% 10-Mar-2026 12:09:20
t2 = abs(y);
t3 = x.^2;
t4 = y.^2;
t5 = z.^2;
t7 = -z;
t6 = t2.^2;
t8 = -t3;
t9 = -t4;
t10 = t+t7;
t11 = -t6;
t12 = t10.^2;
t13 = t3+t6;
t16 = t8+t9;
t14 = t5+t13;
t17 = t8+t11;
t18 = t12+t13;
t20 = sqrt(t16);
t19 = 1.0./sqrt(t14);
t23 = t20+z;
t27 = 1.0./sqrt(t18);
t21 = t19.*z;
t30 = t10.*t27.*x;
t31 = t10.*t27.*y;
if ~all(cellfun(@isscalar,{t23,t8,y,z}))
error(message('symbolic:sym:matlabFunction:ConditionsMustBeScalar'));
end
if (~(0.0 <= t23))
t0 = -(y.*(t21+1.0))./t13;
elseif ((0.0 <= t23) & (y ~= 0.0))
t0 = -y./t13-limit(t31,t == z+sqrt(t17),Left)./t13+limit(t31,t == z+sqrt(t17),Right)./t13+(t7.*t19.*y)./t13;
elseif ((0.0 <= z+sqrt(t8)) & (y == 0.0))
t0 = 0.0;
else
t0 = NaN;
end
if ~all(cellfun(@isscalar,{t23,t9,x,z}))
error(message('symbolic:sym:matlabFunction:ConditionsMustBeScalar'));
end
if (~(0.0 <= t23))
t1 = (x.*(t21+1.0))./t13;
elseif ((0.0 <= t23) & (x ~= 0.0))
t1 = x./t13+limit(t30,t == z+sqrt(t17),Left)./t13-limit(t30,t == z+sqrt(t17),Right)./t13+(t21.*x)./t13;
elseif ((0.0 <= z+sqrt(t9)) & (x == 0.0))
t1 = 0.0;
else
t1 = NaN;
end
Bsym = [t0;t1;0.0];
end
But if you try, you'll get an error.:
fcn1(1,1,1)
Unrecognized function or variable 't'.
Error in fcn1 (line 16)
t10 = t+t7;
^^^^^^^^^^^
Why did matlabFunction() skip the t parameter?

 采纳的回答

syms t real
l = [0;0;t]
l = 
syms x y z real
r = [x;y;z];
sep = r-l
sep = 
dl = diff(l,t)
dl = 
integrand = simplify(cross(dl,sep)./norm(sep).^3,"Steps",100)
integrand = 
Bsym = int(integrand,t,[0 Inf])
Bsym = 
symvar(Bsym)
ans = 
In Bsym, t appears only as a variable in a limit() call.
matlabFunction() cannot deal with limit properly, as limit() is inherently a symbolic call that cannot be translated to pure numeric functions.

3 个评论

Your equations have the possibility that x and y might be 0, in which case the denominator becomes ((t-z)^2)^(3/2) . But if z is positive then because t runs from 0 to inf, at some point t-z will be 0, leading to an all-zero denominator, which you will have trouble integrating over.
Note by the way, that with x and y both real, that involves the square root of a quantity that is at most 0 (if x and y are both 0) and is otherwise negative. So involves mostly complex quantities. The limit() calls generated involve conditionals on which is true if and only if x and y are both 0, and otherwise is a comparison to a complex quantity which is fallse. matlabFunction() really doesn't do that well on limit() calls.
"matlabFunction() cannot deal with limit properly,"
Why can't matlabFunction just punt with a message that "limit" can't be in the input expression?
Maybe you can directly use the antiderivatives:
syms x y z t
int(-y/((t-z)^2+y^2+x^2)^(3/2),t)
ans = 
int(x/((t-z)^2+y^2+x^2)^(3/2),t)
ans = 

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Symbolic Math Toolbox 的更多信息

产品

版本

R2025b

标签

Community Treasure Hunt

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

Start Hunting!

Translated by