2017-02-03 5 views
0

Этот вопрос касается гуманного представления выхода Maxima.Maxima: Как вычислить конечную сумму?

Короче, как сделать

b*d4 + b*d3 + b*d2 + b*d1 + a*sin(c4 + alpha) + a*sin(c3 + alpha) + a*sin(c2 + alpha) + a*sin(c1 + alpha) 

выглядеть

b*sum_{i=1}^{4} d_i + a*sum_{j=1}^{4}sin(c_i + \alpha) 

где сумма _ {*}^{*} * это знак суммирования и выражение с индексами?

Или глубже, как правильно моделировать конечный набор предметов здесь?

Рассмотрим конечный набор сущностей $ x_i $ (пытающийся говорить здесь tex), которые пронумерованы от 1 до n, где n известно. Пусть функция $ F $ зависит от нескольких характеристик этих объектов $ c_ji = c_j (x_i), j = 1..k $ (k - также известно), так что $ F = F (c_11, ..., c_kn) $ ,

Теперь, когда я пытаюсь реализовать это в Maxima и делать с ним вещи, он будет давать суммы и продукты всех видов, где пронумерованные элементы представляются как $ c_1 * a + c_2 * a + c_3 * a + c_4 * a + d_1 * b + d_2 * b + d_3 * b + d_4 * b $, который вы напишете на бумаге как $ a * \ sum_ {i = 1}^{4} c_i + b * sum_ {i = 1}^{4} $ d_i.

Итак, как я могу заставить Maxima делать подобное сокращение выражения?

Чтобы быть более конкретным, здесь фактический пример кода: (выход Maxima отмечен как ">>>")

/* let's have 4 entities: */ 
n: 4 $ 

/* F is a sum of similar components corresponding to each entity F = F_1 + F_2 + F_3 + F_4 */ 
F_i: a*sin(alpha + c_i) + b*d_i; 
>>> b*d_i + a*sin(c_i + alpha) 

/* defining the characteristics */ 
c(i) := concat(c, i) $ 
d(i) := concat(d, i) $ 

/* now let's see what F looks like */ 

/* first, we should model the fact that we have 4 entities somehow: */ 
F_i(i) := subst(c(i), c_i, subst(d(i), d_i, F_i)) $ 

/* now we can evaluate F: */ 
F: sum(F_i(i), i, 1, 4); 
>>> b*d4 + b*d3 + b*d2 + b*d1 + a*sin(c4 + alpha) + a*sin(c3 + alpha) + a*sin(c2 + alpha) + a*sin(c1 + alpha) 

/* at this point it would be nice to do something like:    */ 
/*  pretty(F);              */ 
/* and get an output of:            */ 
/*  $b*\sum_{i=1}^{4}d_i + a*\sum_{j=1}^4 sin(c_j + \alpha)$  */ 
/* not to mention having Maxima write things in the same order as I do */ 

Таким образом, чтобы подвести итог, есть три quetions здесь:

  1. Как я могу рассчитать сумму из выражения, подобного тому, что находится над этим сообщением?
  2. Как я могу позволить Maxima узнать, о чем я говорю здесь?
  3. Как заставить Maxima сохранить мой порядок вещей в выходе?

Заранее спасибо.

ответ

0

Вот путь, по которому я думаю, что вы хотите.

(%i1) n: 4 $ 
(%i2) F(i) := a*sin(alpha + c[i]) + b*d[i]; 
(%o2)     F(i) := a sin(alpha + c) + b d 
               i  i 
(%i3) 'sum(F(i), i,1,4); 
         4 
         ==== 
         \ 
(%o3)     > (a sin(c + alpha) + b d) 
        /   i    i 
         ==== 
         i = 1 
(%i4) declare (nounify(sum), linear); 
(%o4)        done 
(%i5) 'sum(F(i), i,1,4); 
         4       4 
         ====      ==== 
         \       \ 
(%o5)    a > sin(c + alpha) + b > d 
        /  i   / i 
         ====      ==== 
         i = 1      i = 1 
(%i6) 

Самое главное здесь то, что я написал, что мы называем «с суб я» и «d к югу я», как c[i] и d[i] соответственно. Это индексированные переменные с именем c и d, а i - индекс. Нет необходимости в существовании массивов или списков с именем c или d, а i может иметь или не иметь определенное значение.

Я написал F как обычную функцию. Я избегал создания имен переменных через concat и избегал подстановки этих имен в выражение. Я хотел бы подчеркнуть, что такие операции - это, конечно, не самый лучший способ сделать это.

В %i3 обратите внимание, что я написал суммирование как 'sum(...), что делает его так называемым выражением существительного, что означает, что он поддерживается в символической форме и не оценивается.

По умолчанию суммирования не рассматриваются как линейные, поэтому в %i4 я объявлял суммы как линейные, чтобы результат в %o5 был таким, как ожидалось.

Maxima не имеет возможности собирать выражения, такие как a1 + a2 + a3, обратно в символическое суммирование, но, возможно, вам не нужна такая операция.

+0

Благодарим за ответ. Кстати, как я могу вычислить сумму по фактическим спискам значений 'c_i' и' d_i'? – admech

+0

И что более сложно, когда фактические значения известны только подмножеством всех индексированных переменных? Например, если у нас есть сумма '(a_i + b_i)^2' для' i' в '1..4', но мы знаем только, что' a [i] 'находятся в' [4, 5, 6, 7 ] ', в то время как' b [i] 'неизвестны, тогда ожидаемым результатом будет' 126 + sum (b_i^2) + 8 * b_1 + ... '. Не уверен, что это возможно и не требуется (возможно, в таких случаях мы, люди, должны вмешаться и сделать что-то), но любопытно, предлагает ли Maxima способ сделать это. – admech

+0

Ну, 'a: [4, 5, 6, 7]; sum ((a [i] + b [i])^2, i, 1, 4), 'дает' (b [4] +7)^2 + (b [3] +6)^2 + (b [2] +5)^2 + (b [1] +4)^2. Из этого: 'expand (%);' дает 'b [4]^2 + 14 * b [4] + b [3]^2 + 12 * b [3] + b [2]^2 + 10 * b [2] + b [1]^2 + 8 * b [1] + 126'. Таким образом, нет проблем с имеющимися значениями, а b не имеет значений, хотя форма результата несколько беспорядочна. В общем, Maxima довольна выражениями, в которых некоторые переменные имеют значения, а некоторые нет. –

Смежные вопросы