2014 dxdy logo

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

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




 
 Символьное вычисление производной от суммы в Mathematica
Сообщение16.09.2014, 00:21 
Добрый вечер!

Пытаюсь символьно вычислить сумму производных от функции вида:
$f=\sum _{i=1}^n x_i$
Записываю:
$\sum _{k=1}^n \frac{\partial f}{\partial x_k}$
И... получаю 0 (ноль)
Если записать сумму приизводных по индексу $i$, то получим другой интересный результат:
$\sum _{i=1}^n \frac{\partial f}{\partial x_i}=n^2$
Хотя правильный ответ $n$.

Если заранее написать, что $n$ равно какому либо числу, то результат обоих сумм правильный.

Отсюда вопрос, как правильно записывать в Математике такие выражения.
Заранее благодарен.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение16.09.2014, 00:29 
Аватара пользователя
Напишите, пожалуйста, ваш код, а не формулы.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение16.09.2014, 03:28 
Аватара пользователя
Ситуация интересная. Приведу код:
Код:
In[1]:= f = Sum[x[i], {i, 1, n}]

In[2]:= Sum[D[f, x[k]], {k, 1, n}]

Out[2]= 0

In[3]:= Sum[D[f, x[i]], {i, 1, n}]

Out[3]= n^2

In[4]:= D[f, x[i]]

Out[4]= n
Что мы здесь видим?
f равняется в точности Sum[x[i], {i, 1, n}], когда n свободна от значения. При дифференцировании по x[k] получается нуль, поскольку D[Sum[x[i], {i,1,n}], x[k]] = Sum[D[x[i],x[k]], {i,1,n}] и D[x[i],x[k]]=0. Последнее справедливо потому, что для Математики x[i] и x[k] настолько же одинаковые символы, как x и y: действительно, D[x,y]=0. Если дифференцировать по x[i], то будет Sum[Sum[D[x[i],x[i]], {i,1,n}], {i,1,n}], которое равняется n^2.

В то же время, если дать значение n, то f редуцируется до конечной суммы вида Plus[x[1], x[2], x[3], ..., x[n]] и дальнейшие вычисления происходят правильно.

Разрешить проблему я могу предложить следующий способ:
Код:
Unprotect[D];
D[Sum[e_, i_], v_] := Sum[D[e, v], i];
x /: D[x[i_], x[k_]] = KroneckerDelta[i, k];

FullSimplify[Sum[D[f, x[k]], {k, 1, n}], Element[{k}, Integers]]

Out= n

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение16.09.2014, 07:29 
Mysterious Light в сообщении #908316 писал(а):
Ситуация интересная. Приведу код:

Спасибо за код. В тесте я использовал аналогичный.
Попробую Ваш подход к проблеме.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение19.09.2014, 22:54 
Я к сожалению слишком упростил пример - функция в моей задаче немного сложнее, и на ней предложение от Mysterious Light не срабатывает:
Код:
f = Sum[a[i]*y[i]*(x[i])^m, {i, 1, n}]

Сейчас вышел из ситуации, посчитав производную руками и сделав замену через ReplaceAll по своим формулам.
Но всёже интересно, как обьяснить Математике, как брать производную в моём случае.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение20.09.2014, 00:43 
Можно модифицировать идею Mysterious Light:
Код:
f = Sum[a[i]*y[i]*(x[i])^m, {i, 1, n}];
Unprotect[D];
x /: D[Sum[expr_, {k_, ind___}], x[j_]] := D[expr /. k ->j, x[j]]

Конечно, тут предполагается, что где-то среди $k$ встречается индекс $j$. Тогда D[f, x[i]] даст m*a[i]*y[i]*x[i]^(m - 1).

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение21.09.2014, 10:45 
Аватара пользователя
Код:
Unprotect[D];
D[Sum[e_, i_], v_] := Sum[D[e, v], i];
x /: D[x[i_], x[k_], ___] = KroneckerDelta[i, k];

In[31]:= Sum[D[f, x[k], NonConstants -> x], {k, 1, n}]

Out[31]= Sum[Sum[m*a[i]*KroneckerDelta[i, k]*x[i]^(-1 + m)*y[i], {i, 1, n}],
{k, 1, n}]

Как видно, добавление NonConstants -> x и тройного подчёркивания (ради этого же NonConstants) приводит код в работающее состояние. Тем не менее, двойная сумма не упрощается. Это уже вопрос не к дифференцированию, а к оператору суммы.
Вопрос к знатокам: почему последнее выражение не редуцируется до одиночной суммы по k, даже если вызвать FullSimplify с предположениями $k,i,n,m\in\mathbb{Z} \; \&\&  \; n,m>1 \;\&\&\; a[\_],x[\_],y[\_]\in\mathbb{R}$?

К ТС: ищите специальные пакеты для подобных нужд, наверняка таковые имеются.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение21.09.2014, 11:33 
Не умеет, вероятно. Такое
Код:
Sum[KroneckerDelta[i, k], {i, 1, n},  Assumptions -> {k \[Element] Integers, 1<= k <= n}]

упрощает до 1, а такое

Код:
Sum[KroneckerDelta[i, k] x[i], {i, 1, n},  Assumptions -> {k \[Element] Integers,  1 <= k <= n}]

уже нет.

 
 
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение21.09.2014, 14:34 
Аватара пользователя
Печалит меня эта ситуация. Поискал по просторам Интернета что-то подобное и не нашел. Только то, что при бесконечных суммах можно менять регуляризацию для того, чтобы программа упрощала, как надо.

Можно, конечно, и это руками исправить:
Код:
Unprotect[Sum];

Sum[expr_ /; MemberQ[expr, KroneckerDelta[__], Infinity], {v_, min_, max_}, opts : OptionsPattern[]] :=
  With[{kc = Cases[expr, (KroneckerDelta[v, x_] | KroneckerDelta[x_, v]) :> x, Infinity, 1][[1]]},
   Print["Trying!"];
   Simplify[
     Boole[min <= kc <= max && kc \[Element] Integers] (expr /. v -> kc), Assumptions -> OptionValue[Assumptions]] +
    With[{e = Boole[kc != v] expr /. (KroneckerDelta[v, kc] | KroneckerDelta[kc, v]) -> 0},
      Sum[e, {v, min, max}, opts]]];

In:= Sum[D[f, x[k], NonConstants -> x], {k, 1, n}]
Out= Sum[m*a[k]*Boole[1 <= k <= n && Element[k, Integers]]*x[k]^(-1 + m)*y[k], {k, 1, n}]
но это же изврат...

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


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