符号int导致删除主变量(MATLAB)

符号int导致删除主变量(MATLAB),matlab,symbolic-math,Matlab,Symbolic Math,我正在尝试这样做: syms x h4 t4 c13; t = 0.6*sin(pi*x); h1x = 0.5*(1 - t); h0 = h1x; h14x = -h4 -t4*(x - 0.5); h24x = h4 + t4*(x - 0.5); symvar(h14x) 返回 ans = [ h4, t4, x] 然后 返回 u13x = -(c13 + 4*x*(h4 - t4/2) + 2*t4*x^2)/((3*sin(pi*x))/10 - 1/2) ans = [

我正在尝试这样做:

syms x h4 t4 c13;
t = 0.6*sin(pi*x);
h1x = 0.5*(1 - t);
h0 = h1x;
h14x = -h4 -t4*(x - 0.5);
h24x = h4 + t4*(x - 0.5);
symvar(h14x)
返回

ans =

[ h4, t4, x]
然后

返回

u13x =

-(c13 + 4*x*(h4 - t4/2) + 2*t4*x^2)/((3*sin(pi*x))/10 - 1/2)

ans =

[ c13, h4, t4, x]

那是

p12x =

-3*int(-(c13 + 4*x*(h4 - t4/2) + 2*t4*x^2)/((3*sin(pi*x))/10 - 1/2), x, 0, x)

ans =

[ c13, h4, t4 ]

u13x
中可以看到,变量是
[h4,t4,c13,x]
,当积分到
p12x
时,即使积分限值是可变的(就
x
),它也会降低到
[h4,t4,c13]
。是虫子吗?我似乎无法忍受这种奇怪的行为。有解决办法吗?

这里有三种可能的解决办法(在R2015a中测试)

1。使用符号功能
一个选项是根据
x
创建将传递给
sym/symvar
a的输入,然后使用可选的第二个参数指定要查找的有限数量的变量:

syms x h4 t4 c13;
t = 0.6*sin(pi*x);
h1x = 0.5*(1 - t);
h0 = h1x;
h14x = -h4 -t4*(x - 0.5);
u13x = (-4*int(h14x, x, 0, x) + c13)/h0
p12x(x) = -3*int(u13x, x, 0, x) % Make symfun, function of x
n = realmax;                    % 4 or greater to get all variables in this case
symvar(p12x, n)                 % Second argument must be finite integer
它返回预期的
[x,t4,h4,c13]
。只需将第二个参数设置为非常大的整数值就可以了

2。将表达式转换为字符串
实际上有两个版本的
symvar
。对于字符串输入和符号数学工具箱中的符号表达式,有两种方法。在这种情况下,这两种形式的行为显然不同。因此,另一种解决方法是将带有
int
的等式转换为字符串,然后将其传递给
symvar
,然后将输出转换回符号变量向量:

syms x h4 t4 c13;
t = 0.6*sin(pi*x);
h1x = 0.5*(1 - t);
h0 = h1x;
h14x = -h4 -t4*(x - 0.5);
u13x = (-4*int(h14x, x, 0, x) + c13)/h0
p12x = -3*int(u13x, x, 0, x)
sym(symvar(char(p12x))).'
它还返回预期的
[c13,h4,t4,x]
(请注意,顺序似乎与上面的第一个解决方法相反)

3。从Matlab调用MuPAD函数
最后,可以调用在表达式中查找终止项的函数

syms x h4 t4 c13;
t = 0.6*sin(pi*x);
h1x = 0.5*(1 - t);
h0 = h1x;
h14x = -h4 -t4*(x - 0.5);
u13x = (-4*int(h14x, x, 0, x) + c13)/h0
p12x = -3*int(u13x, x, 0, x)
feval(symengine, 'x->indets(x) minus Type::ConstantIdents', p12x)
返回
[x,c13,h4,t4]
。如果输入
p12x
为class
sym
symfun
,则此功能将起作用。您还可以使用:

evalin(symengine, ['indets(hold(' char(p12x) ')) minus Type::ConstantIdents'])

在您的案例中,
sym/symvar
不起作用的原因是它基于引擎盖下,它明确地忽略了函数中的自由变量,如
int

,谢谢您的回复。因此,正如第一个解决方案中所建议的,我们可以显式地定义任何这样的函数?(通过像您在
p12(x)
中那样预先定义主要变量)@adityakumarraharaj:您确定您正在使用的是这个版本,并且您已经安装了符号数学工具箱吗?您是否清除了所有,并在我的答案中使用了正确的代码?我刚刚在我自己的R2014b副本中测试了第一个变通方法,效果很好。第二种解决方法也很有效。对于第三个,只有
evalin
string版本可以正常工作。至于
p12x(x)
(不要像您的评论中那样
p12(x)
,否则它将不适用于代码的其余部分)表单,请参阅我在第一个解决方法中链接的文档。
syms x h4 t4 c13;
t = 0.6*sin(pi*x);
h1x = 0.5*(1 - t);
h0 = h1x;
h14x = -h4 -t4*(x - 0.5);
u13x = (-4*int(h14x, x, 0, x) + c13)/h0
p12x = -3*int(u13x, x, 0, x)
feval(symengine, 'x->indets(x) minus Type::ConstantIdents', p12x)
evalin(symengine, ['indets(hold(' char(p12x) ')) minus Type::ConstantIdents'])