2014 dxdy logo

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

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




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


09/02/13
31
Добрый вечер!

Пытаюсь символьно вычислить сумму производных от функции вида:
$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 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Напишите, пожалуйста, ваш код, а не формулы.

 Профиль  
                  
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение16.09.2014, 03:28 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Ситуация интересная. Приведу код:
Код:
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 


09/02/13
31
Mysterious Light в сообщении #908316 писал(а):
Ситуация интересная. Приведу код:

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

 Профиль  
                  
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение19.09.2014, 22:54 


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

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

 Профиль  
                  
 
 Re: Символьное вычисление производной от суммы в Mathematica
Сообщение20.09.2014, 00:43 
Заслуженный участник


25/02/11
1786
Можно модифицировать идею 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 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Код:
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 
Заслуженный участник


25/02/11
1786
Не умеет, вероятно. Такое
Код:
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 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Печалит меня эта ситуация. Поискал по просторам Интернета что-то подобное и не нашел. Только то, что при бесконечных суммах можно менять регуляризацию для того, чтобы программа упрощала, как надо.

Можно, конечно, и это руками исправить:
Код:
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group