首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从包含特定变量MAPLE的符号表达式中获得部分表达式?

如何从包含特定变量MAPLE的符号表达式中获得部分表达式?
EN

Stack Overflow用户
提问于 2018-09-17 13:16:17
回答 2查看 64关注 0票数 2

我有一个符号表达式如下

代码语言:javascript
运行
复制
y1 = (1/a)-(b/a^2)+x*a*b-x/b
y2 = a*b+a*x+b*sqrt(x)

现在我需要得到有特定术语的部分表达式。喜欢

代码语言:javascript
运行
复制
xFunction(y1, x) # should return x*a*b-x/b
xFunction(y2,x)  # should return a*x+b*sqrt(x)

任何建议或想法都是非常健康的谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-17 14:07:20

代码语言:javascript
运行
复制
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)

编辑过的

代码语言:javascript
运行
复制
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命令将第一个参数映射到第二个参数的所有操作数上。

代码语言:javascript
运行
复制
select( s->depends(s,x), y1 );

                               x
                       x a b - -
                               b

一种更简洁的语法,其中select将其第一个参数depends映射到其第二个参数的操作数之上,并将其第三个参数作为附加选项(传递给选择器)。

代码语言:javascript
运行
复制
select( depends, y1, x );

                               x
                       x a b - -
                               b

现在创建一个过程来完成它。使用条件测试,以便当第一个参数本身不是项和时,它就返回第一个参数本身。

代码语言:javascript
运行
复制
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

对类型检查使用更简洁的语法。

代码语言:javascript
运行
复制
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中的language关键字。

代码语言:javascript
运行
复制
K3 := proc(ee, x)
  `if`( ee::`+` , select( depends, ee, x ), x );
end proc:

K3( y1, x);

                               x
                       x a b - -
                               b

因为过程K3的主体只有一条语句,所以我们可以使用所谓的运算符形式使它更加简洁。

代码语言:javascript
运行
复制
K4 := (ee, x) -> `if`( ee::`+` , select( depends, ee, x ), x ):

K4( y1, x);

                               x
                       x a b - -
                               b
票数 3
EN

Stack Overflow用户

发布于 2018-09-17 13:45:35

代码语言:javascript
运行
复制
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

以上代码符合我的要求。但是,如果有什么特殊表达的But,请告诉我。因为op函数的行为不同,当我们有像(sin,因为日志..etc)这样的函数时

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52368691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档