符号 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 sym
或 symfun
,这将起作用。您还可以使用:
evalin(symengine, ['indets(hold(' char(p12x) ')) minus Type::ConstantIdents'])
sym/symvar
在您的情况下不起作用的原因是因为它基于 freeIndets
底层,它明确忽略了 int
等函数中的自由变量。
我正在尝试做这样的事情:
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 sym
或 symfun
,这将起作用。您还可以使用:
evalin(symengine, ['indets(hold(' char(p12x) ')) minus Type::ConstantIdents'])
sym/symvar
在您的情况下不起作用的原因是因为它基于 freeIndets
底层,它明确忽略了 int
等函数中的自由变量。