Как получить частичное выражение из символического выражения, содержащего конкретную переменную MAPLE? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть символические выражения, как показано ниже

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)

любые предложения или идеи очень полезны Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018
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

Теперь создайте процедуру, чтобы сделать это.Используйте условный тест, чтобы он возвращал сам первый аргумент всякий раз, когда это не сумма терминов.

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
0 голосов
/ 17 сентября 2018
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

Выше кода соответствует моему требованию.Но, если есть какие-то ошибки для специальных выражений, пожалуйста, дайте мне знать.Потому что функция op ведет себя иначе, когда у нас есть такие функции, как (sin, cos Log ..etc)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...