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

Symbolic int results in deletion of main variable (MATLAB)

我正在尝试做这样的事情:

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)

哪个returns

ans =

[ h4, t4, x]

然后

u13x = (-4*int(h14x, x, 0, x) + c13)/h0
symvar(u13x)

returns

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(u13x, x, 0, x)
symvar(p12x)

也就是

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 时它减少到 [h4, t4, c13],即使积分限制是可变的(根据 x)。这是一个错误吗?我似乎无法忍受这种奇怪的行为。有解决方法吗?

以下是三种可能的解决方法(已在 R2015a 中测试)。

1.使用符号函数
一种选择是根据 x 使将传递给 sym/symvar 的输入成为 symfun,然后使用可选的第二个参数指定要查找的有限数量的变量:

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

returns 预期 [ x, t4, h4, c13]。只需将第二个参数设置为一个非常大的整数值似乎就可以了。

2。将表达式转换为字符串
symvar实际上有两个版本。在将它传递给symvar之前有symvar for string inputs and sym/symvar, in the Symbolic Math toolbox, for symbolic expressions. The two forms apparently behave differently in this case. So, another workaround is to convert the equation with int to a character string with sym/char,然后将输出转换回符号变量的向量:

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))).'

这也是 returns 预期的 [ c13, h4, t4, x](请注意,顺序似乎与上面的第一个解决方法相反)。

3。从 Matlab 调用 MuPAD 函数
最后,您可以调用 MuPAD function indets 来查找表达式中的不确定项。

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)

其中 returns [ x, c13, h4, t4]。如果输入 p12x 是 class symsymfun,这将起作用。您还可以使用:

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

sym/symvar 在您的情况下不起作用的原因是因为它基于 freeIndets 底层,它明确忽略了 int 等函数中的自由变量。