Как мне сделать эту замену в Mathematica? - PullRequest
3 голосов
/ 14 декабря 2010

Я только начинаю с Mathematica, и у меня есть довольно простой вопрос о замене, но я не могу заставить его работать.

Я бы хотел найти уравнения Эйлера-Лагранжа для функционала функции phi [x, y], а затем сделать замену функции phi [x, y]

Если я введу следующее:

VariationalD[tau*phi[x, y]^2 - 2*phi[x, y]^4 + phi[x, y]^6 + Dot[D[phi[x, y], {{x, y}}], D[phi[x, y, {{x, y}}]]], phi[x, y], {x, y}]

Я получаю

Plus[Times[2,tau,phi[x,y]],Times[-8,Power[phi[x,y],3]],Times[6,Power[phi[x,y],5]],Times[-2,Plus[Derivative[0,2][phi][x,y],Derivative[2,0][phi][x,y]]]]

Теперь, если я попытаюсь % /. phi[x,y] -> phi0[x,y] + psi[x,y], он заменит все полиномиальные члены, но не на производные.

Как заставить подстановку в эти функции?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2010

Я согласен со всем, что говорит rcollyer , но я думаю, что его окончательное решение может быть немного непрозрачным.

Самое простое правило, которое я мог бы придумать (которое является в принципето же самое, что и rcollyer)

{phi[x__] :> phi0[x] + psi[x], f_[phi][x__] :> f[phi0][x] + f[psi][x]}

или что-то с менее возможными побочными эффектами

{phi[x__] :> phi0[x] + psi[x], Derivative[n__][phi][x__] :> Derivative[n][phi0][x] + Derivative[n][psi][x]}

Было бы намного проще, если бы Derivative имел свойство Default (сравнитеDefault[Times] с Default[Derivative]).Это должно быть что-то вроде Default[Derivative] := Sequence[], но, к сожалению, это не очень подходит для сопоставления с образцом.

Возвращаясь к вашему вопросу, вы, вероятно, захотите определить что-то вроде

VariationalD[expr_, sym_, var_] := Module[{
  vRule = {sym[x__] :> sym[x] + var[x], 
    Derivative[n__][sym][x__] :> Derivative[n][sym][x] + Derivative[n][var][x]}}, 
  (expr /. vRule) - expr]

Гдеизменение var символа sym предполагается небольшим.Конечно, тогда вам нужно развернуть серию вокруг var=0 и сохранить только линейную часть.Затем используйте интегрирование по частям для любого термина, который имеет производные var.Все из которых должны быть включены в вышеупомянутый модуль.

2 голосов
/ 15 декабря 2010

Во-первых, вы потеряли ] во втором производном члене, оно должно читаться как D[phi[x, y], {{x, y}}]], а не D[phi[x, y, {{x, y}}]]].

Тем не менее, замена в Mathematica может быть сложной, как было указано в других вопросах .Это не значит, что это невозможно, просто требует некоторой работы.В этом случае проблема заключается в том, что phi[x,y] отличается от Derivative[2, 0][phi][x, y].Таким образом, ваш шаблон не будет соответствовать производному члену.Самое простое, что нужно сделать, это добавить правило

Derivative[a__][phi][x__]:> Derivative[a][phi0][x] + Derivative[a][psi][x]

в список правил замены.Три вещи, на которые следует обратить внимание: 1) я использую ReplaceDelayed, чтобы оба типа производных соответствовали без написания нескольких правил, 2) поскольку я могу использовать шаблоны, я назвал их так, чтобы я мог ссылаться на них в RHS правила,и 3) я использовал двойное подчеркивание при определении a и x, которое будет соответствовать одному или нескольким элементам в последовательности.

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

Редактировать : для этого требуется двойная замена, как указано ниже

<result> /. phi -> phi0 + psi /. a_[b__][c__] :> Through[Distribute[a[b]][c]]

Distribute гарантирует, что производная работает правильно с Plus, а Through делает то же самое с аргументами функции c.Ключ в том, что Head из Derivative[2, 0][phi][x, y] равно Derivative[2, 0][phi], поэтому в правиле есть несколько уровней квадратных скобок.

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