2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Оператор Хироты в Wolfram Mathematica
Сообщение23.02.2021, 16:24 
Аватара пользователя
Доброго времени суток!

Пытаюсь опеределить в wolfram-e билинейный оператор Хироты:
$$D_x^n f\cdot g=\left.\frac{\partial^n}{\partial s ^n} f(x+s)g(x-s)\right|_{s=0}$$
То есть
$D_x^1 f\cdot g=g(x) f'(x)-f(x) g'(x)$

$D_x^2 f\cdot g=g(x) f''(x)-2 f'(x) g'(x)+f(x) g''(x)$

$D_x^3 f\cdot g=g(x) f'''(x) -3g'(x) f''(x) +3  g''(x) f'(x)-g'''(x)f(x) $

Написал
Код:
HirotaD[a_[x_], b_[x_], n_] :=  Module[{}, sol = D[a[x + y]*b[x - y], {y, n}] /. y -> 0]


Вроде как бы и работает,
Код:
In: HirotaD[Sin[x], Cos[x], 1]

Код:
Out: Cos[x]^2 + Sin[x]^2

и как бы и нет
Код:
In: HirotaD[Sin[x]/x,Exp[x],1]

Код:
Out:HirotaD[Sin[x]/x, E^x, 1]

Как я понял она не может определить аргумент.
Кто ладит с функ. языком wolfram, подскажите.

 
 
 
 Re: Оператор Хироты в Wolfram Mathematica
Сообщение23.02.2021, 16:51 
Вот так вроде срабатывает.
Код:
HirotaD[x_, n_] :=  (D[#1[x + y]*#2[x - y], {y, n}] /. y -> 0)&; FullSimplify[HirotaD[x, 1][Sin[#]/#&, Exp[#]&]]

 
 
 
 Re: Оператор Хироты в Wolfram Mathematica
Сообщение23.02.2021, 17:22 
TelmanStud в сообщении #1506191 писал(а):
Код:
HirotaD[a_[x_], b_[x_], n_] := Module[{}, sol = D[a[x + y]*b[x - y], {y, n}] /. y -> 0]
Я бы удивился, что a_[x_] вообще хоть иногда срабатывает. :-) Для использования с выражениями и переменными обычно переменную указывают отдельно (посмотрите например на FourierTransform или Convolve — там и «входная», и «выходная» переменные указываются пользователем). Тогда можно написать такое:

Код:
HirotaD[a_, b_, {x_, n_}] := Module[{v, s}, D[(a /. x -> v + s) (b /. x -> v - s), {s, n}] /. {s -> 0, v -> x}]
HirotaD[a_, b_, x_] := HirotaD[a, b, {x, 1}]

Проверяем, даёт такое:

Код:
In[4]:= HirotaD[Sin[x], Cos[x], x]
Out[4]= Cos[x]^2 + Sin[x]^2

In[5]:= HirotaD[Sin[x]/x, Exp[x], x]
Out[5]= (E^x Cos[x])/x - (E^x Sin[x])/x^2 - (E^x Sin[x])/x

(Module защищает на всякий случай от ошибок, если использовать переменные v или s в исходных выражениях.)

-- Вт фев 23, 2021 19:25:11 --

В принципе я зря перестраховался с v, вот это работает точно так же:

Код:
HirotaD[a_, b_, {x_, n_}] := Module[{s}, D[(a /. x -> x + s) (b /. x -> x - s), {s, n}] /. s -> 0]

 
 
 
 Re: Оператор Хироты в Wolfram Mathematica
Сообщение23.02.2021, 17:35 
Аватара пользователя
Sender
Спасибо! Однако хотелось указывать функции в явном виде в аргументах у оператора.
arseniiv

Спасибо! Сняли вопрос.

(Оффтоп)

arseniiv
Потихоньку вхожу в список ваших должников))

 
 
 
 Re: Оператор Хироты в Wolfram Mathematica
Сообщение23.02.2021, 17:51 
Ой, могут быть проблемы, если внутри будет использоваться какое-нибудь интегрирование по выбранной переменной: /. позаменяет всё без разбору. Но может быть у вас такое не встретится. Кажется, чтобы проблем в таких случаях не было, надо накрутить что-то хитрое, и если вдруг понадобится, подумаем. (Может, Aritaborian тогда был бы в курсе.)

(Оффтоп)

TelmanStud в сообщении #1506202 писал(а):
Потихоньку вхожу в список ваших должников))
Да мне в первую очередь приятно, если совет оказывается полезным и чем-то помогает. :-)

 
 
 
 Re: Оператор Хироты в Wolfram Mathematica
Сообщение26.02.2021, 05:09 
Можно обойтись без замен, если использовать Derivative[]:

Код:
ClearAll[hirota] ;
hirota[n_Integer][f_, g_][x_] := Derivative[n][f[x + #]*g[x - #] &][0]
hirota[1][f, g][x]
hirota[1][Sin, Cos][x]
hirota[1][1/#*Sin[#] &, Exp][x]


Или можно напрямую собрать:

Код:
ClearAll[hirota] ;
hirota[n_Integer][f_, g_][x_] := Times[
   (-1)^Range[1, n +1]*(-1)^(n-1),
   Map[Apply[Multinomial], FrobeniusSolve[{1, 1}, n]],
   NestList[D[#, x] &, f[x], n],
   Reverse[NestList[D[#, x] &, g[x], n]]
] // Total ;
hirota[1][f, g][x]
hirota[1][Sin, Cos][x]
hirota[1][1/#*Sin[#] &, Exp][x]

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group