Я обнаружил странное поведение в MuPAD версии 5.7.0 (MATLAB R2011b), и я хотел бы знать, является ли это ошибкой, а если нет, то что я делаю неправильно. В идеале я также хотел бы знать, почему MuPAD делает то, что делает.
Рассмотрим массив C
размером 3x3, элементы которого имеют несколько примерных значений. Я хотел бы рассматривать этот массив как массив массивов и поэтому использовать каскадную индексацию.
Проблема, по-видимому, возникает, когда оба индекса являются локальными переменными разных вложенных областей, а именно, когда область действия первого индекса шире, чем область второго индекса. Нет проблем, если первый индекс постоянный.
Когда я вхожу:
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
sum((C[3])[t], t = 1..3);
S := j -> sum((C[j])[t], t = 1..3);
S(3);
Получаю следующий результат:
Я ожидаю, что строки 3 и 5 в коде (2 и 4 на выходе) дадут тот же результат: g+h+i
. Вместо этого в строке 5 получается a+e+i
, что похоже на диагональ C
.
Когда я делаю то же самое с product
вместо sum
, результат становится еще более странным, но может раскрыть больше об источнике "ошибки", особенно DOM_VAR(0,2)
:
reset();
C := [[a,b,c],[d,e,f],[g,h,i]];
product((C[3])[t], t = 1..3);
eval(product((C[3])[t], t = 1..3));
S := j -> product((C[j])[t], t = 1..3);
S(3);
eval(S(3));
Я получил:
Возможно, я ошибаюсь здесь, но я подозреваю, что создается замыкание, которое пытается сохранить локальные переменные окружающей области, которые не определены во время создания замыкания. Кроме того, кажется, что в какой-то момент подстановки прекращаются, что отменяется eval()
.
Практическая проблема
Практическая проблема, которую я пытаюсь решить, заключается в следующем:
reset();
aVec := Symbol::accentUnderBar(Symbol::alpha)
Задача: вычислить многочлены вида
hold(sum(x(i), i=i_0..i_k)^n)
В Википедии определена следующая форма:
sumf := freeze(sum):
hold(sum(x[i], i=1..m)^n)=sumf(binomial(n,aVec)*product(x[t]^aVec[t], t = 1..m), abs(aVec)=n);
Чтобы реализовать это, нам нужно определить набор векторов альфа, сумма которых равна m. Они соответствуют множеству возможных композиций n длины m и возможных нулевых элементов:
C := (n,m) -> combinat::compositions(n, MinPart = 0, Length = m)
Например, сумма
n := 3:
m := 3:
sumf(x[i], i=1..m)^n = sum(x[i], i=1..m)^n;
потребует этих комбинаций полномочий, каждая из которых является одним вектором альфа:
A := C(n,m)
Дополнительно нам понадобятся полиномиальные коэффициенты. Каждый такой коэффициент зависит от вектора альфа и степени n:
multinomial := (n, aVec) -> fact(n) / product(fact(aVec[k]), k = 1..nops(aVec))
Например, количество появлений второй композиции:
multinomial(n, A[2])
Суммирование по всем композициям дает:
sum(multinomial(n,A[i])*product(x[t]^A[i][t], t = 1..m), i = 1..nops(A))
Степени верны, а коэффициенты - нет. Кажется, это связано с упрощенной абстрактной проблемой, поставленной первой в этом вопросе.
C := [[a,b,c],[d,e,f],[g,h,i]];
массив. Вы действительно пытаетесь построить матрицу 3 на 3? - person horchler   schedule 27.05.2015