如何从包含特定变量 MAPLE 的符号表达式中获取部分表达式?
How to get partial expression from symbolic expression containing specific variable MAPLE?
我有如下的符号表达式
y1 = (1/a)-(b/a^2)+x*a*b-x/b
y2 = a*b+a*x+b*sqrt(x)
现在我需要获取具有特定术语的部分表达式。喜欢
xFunction(y1, x) # should return x*a*b-x/b
xFunction(y2,x) # should return a*x+b*sqrt(x)
任何建议或想法都非常有益
谢谢
listOfTerms = op(expression); # y1 or y2
numberOfSubExpressions=nops(expression); # for y1 or y2
requiredTerm = 0;
for i 1 to numberOfSubExpressions do
if has(listOfTerms [i], x) then # x is our required term
requiredTerm := requiredTerm +listOfTerms [i]
end if
end do
以上代码满足了我的要求。但是,如果特殊表达式有任何错误,请告诉我。因为当我们有像 (sin,cos Log ..etc)
这样的函数时,op 函数的行为会有所不同
restart;
y1 := (1/a)-(b/a^2)+x*a*b-x/b:
y2 := a*b+a*x+b*sqrt(x):
K := (ee,x) -> `if`(ee::`+`,select(depends,ee,x),ee):
K( y1, x );
x
x a b - -
b
K( y2, x );
(1/2)
a x + b x
#
# Leave alone an expression which is not a sum of terms.
#
K( sin(x+4)*x^3, x );
3
sin(x + 4) x
#
# Don't select subterms in which `x` is a just dummy name.
#
K( x^3 + sin(x) + Int(sqrt(x), x=a..b), x );
3
x + sin(x)
[已编辑]
y1 := (1/a)-(b/a^2)+x*a*b-x/b;
1 b x
y1 := - - -- + x a b - -
a 2 b
a
op(3,y1);
x a b
depends(op(3,y1), x);
true
select
命令将其第一个参数映射到
它的第二个参数的所有操作数。
select( s->depends(s,x), y1 );
x
x a b - -
b
更简洁的语法,其中 select
映射其第一个
第二个操作数的参数 depends
参数,并将其第三个参数作为附加参数传递
选项(到选择器)。
select( depends, y1, x );
x
x a b - -
b
现在创建一个程序来完成它。使用条件
测试,使其 returns 第一个参数本身
每当这不是项的总和时。
K1 := proc(ee, x)
if type(ee,`+`) then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K1( y1, x);
x
x a b - -
b
对该类型检查使用更简洁的语法。
K2 := proc(ee, x)
if ee::`+` then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K2( y1, x);
x
x a b - -
b
对 if..then..end if 使用更简洁的语法。
这就是所谓的if
的运算符形式。这个单词
if
在名称引号内,以区别于
if...then...end if 中的语言关键字。
K3 := proc(ee, x)
`if`( ee::`+` , select( depends, ee, x ), x );
end proc:
K3( y1, x);
x
x a b - -
b
因为程序K3的主体只有一条语句那么
我们可以使用所谓的运算符使其更简洁
形式。
K4 := (ee, x) -> `if`( ee::`+` , select( depends, ee, x ), x ):
K4( y1, x);
x
x a b - -
b
我有如下的符号表达式
y1 = (1/a)-(b/a^2)+x*a*b-x/b
y2 = a*b+a*x+b*sqrt(x)
现在我需要获取具有特定术语的部分表达式。喜欢
xFunction(y1, x) # should return x*a*b-x/b
xFunction(y2,x) # should return a*x+b*sqrt(x)
任何建议或想法都非常有益 谢谢
listOfTerms = op(expression); # y1 or y2
numberOfSubExpressions=nops(expression); # for y1 or y2
requiredTerm = 0;
for i 1 to numberOfSubExpressions do
if has(listOfTerms [i], x) then # x is our required term
requiredTerm := requiredTerm +listOfTerms [i]
end if
end do
以上代码满足了我的要求。但是,如果特殊表达式有任何错误,请告诉我。因为当我们有像 (sin,cos Log ..etc)
这样的函数时,op 函数的行为会有所不同restart;
y1 := (1/a)-(b/a^2)+x*a*b-x/b:
y2 := a*b+a*x+b*sqrt(x):
K := (ee,x) -> `if`(ee::`+`,select(depends,ee,x),ee):
K( y1, x );
x
x a b - -
b
K( y2, x );
(1/2)
a x + b x
#
# Leave alone an expression which is not a sum of terms.
#
K( sin(x+4)*x^3, x );
3
sin(x + 4) x
#
# Don't select subterms in which `x` is a just dummy name.
#
K( x^3 + sin(x) + Int(sqrt(x), x=a..b), x );
3
x + sin(x)
[已编辑]
y1 := (1/a)-(b/a^2)+x*a*b-x/b;
1 b x
y1 := - - -- + x a b - -
a 2 b
a
op(3,y1);
x a b
depends(op(3,y1), x);
true
select
命令将其第一个参数映射到
它的第二个参数的所有操作数。
select( s->depends(s,x), y1 );
x
x a b - -
b
更简洁的语法,其中 select
映射其第一个
第二个操作数的参数 depends
参数,并将其第三个参数作为附加参数传递
选项(到选择器)。
select( depends, y1, x );
x
x a b - -
b
现在创建一个程序来完成它。使用条件 测试,使其 returns 第一个参数本身 每当这不是项的总和时。
K1 := proc(ee, x)
if type(ee,`+`) then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K1( y1, x);
x
x a b - -
b
对该类型检查使用更简洁的语法。
K2 := proc(ee, x)
if ee::`+` then
select( depends, ee, x );
else
# leave it alone
ee;
end if;
end proc:
K2( y1, x);
x
x a b - -
b
对 if..then..end if 使用更简洁的语法。
这就是所谓的if
的运算符形式。这个单词
if
在名称引号内,以区别于
if...then...end if 中的语言关键字。
K3 := proc(ee, x)
`if`( ee::`+` , select( depends, ee, x ), x );
end proc:
K3( y1, x);
x
x a b - -
b
因为程序K3的主体只有一条语句那么 我们可以使用所谓的运算符使其更简洁 形式。
K4 := (ee, x) -> `if`( ee::`+` , select( depends, ee, x ), x ):
K4( y1, x);
x
x a b - -
b