Как сообщить клену, что производная от нуля равна нулю при подстановке?

Я пытаюсь использовать subs в Maple, чтобы заменить производные в более длинной формуле на 0:

subs(diff(u(r),r) = 0, formula);

Кажется, что если formula включает только первые производные от u(r), это работает так, как я ожидаю. Например,

formula := diff(u(r),r);
subs(diff(u(r),r) = 0, formula);
                                        0

Но если formula включает вторые производные, я получаю diff(0,r) в результате, который не исчезнет даже при использовании simplify:

formula := diff(u(r),r,r);
subs(diff(u(r),r) = 0, formula);
                                         d
                                         -- 0
                                         dr

(Мое фактическое formula довольно длинное, включая первую и вторую производные двух переменных. Я знаю, что все производные по отношению к определенной переменной равны 0, и я хотел бы их удалить).


person Alec Jacobson    schedule 09.09.2015    source источник


Ответы (1)


Один из способов — использовать команду simplify с так называемыми боковыми связями.

formula := diff(u(r),r,r) + 3*cos(diff(u(r),r,r))
           + diff(u(r),r) + x*(4 - diff(u(r),r,r,r)):

simplify( formula, { diff(u(r),r) = 0 } );

                               3 + 4 x

formula2 := diff(u(r,s),s,s) + 3*cos(diff(u(r,s),r,r))
            + diff(u(r,s),r) + x*(4 - diff(u(r,s),r,s,r,r)):

simplify( formula2, { diff(u(r,s),r) = 0 } );

                          /  2         \      
                          | d          |      
                      3 + |---- u(r, s)| + 4 x
                          |   2        |      
                          \ ds         /      

[править] Я забыл ответить на ваш дополнительный вопрос о том, почему вы получили d/dr 0 раньше. Ответ в том, что вы использовали subs вместо 2-аргумента eval. Первый выполняет чисто синтаксическую замену и не оценивает результат. Последний часто нужен людям, не подозревая об этом, и выполняет «оценку в (определенной) точке».

formulaA := diff(u(r),r,r):

subs(diff(u(r),r) = 0, formulaA);

                          d   
                         --- 0
                          dr  

%; # does an evaluation

                           0

eval(formulaA, diff(u(r),r) = 0);

                           0

formulaB := diff(u(r,s),s,r,r,s):

eval(formulaB, diff(u(r,s),r) = 0);

                           0

Вы можете видеть, что любая оценка этих объектов d/dr 0 даст 0. Но часто лучше использовать оценку с двумя аргументами, чем eval(subs(...)). Люди используют subs, потому что это звучит как "замена", я думаю, или они видят, что другие используют это. Иногда subs является подходящим инструментом для работы, поэтому важно знать разницу.

person acer    schedule 10.09.2015
comment
Это работает для меня. Я все еще хотел бы знать, откуда берутся тезисы d/dr 0 и как я буду от них избавляться. - person Alec Jacobson; 10.09.2015
comment
Хорошо, я добавил примечание о subs. - person acer; 10.09.2015