Искам автоматично да изчисля разширения на полиноми, където има променливи (x1, x2, ...), както и коефициенти (c1, c2, ...). Целта ми е да изчисля p(1)*(c1*x1+c2*x2+...)^n+ ... + p(n)*(c1*x1+c2*x2+...)^n .
Както можете да забележите, полученият израз може да бъде написан като F(x1,x2...)*g(c1,c2,...)
[където F е редовна матрица, а g е матрица на колоните], т.е. има някакво мултипликативно разделяне между коефициентите и променливите.
В момента използвам символния набор от инструменти MATLAB и конструирам F и g, като ръчно изследвам получените символни разширения. Това не е много възможно, сякаш n е голям и c=(c1,c2,...)
е твърде голям има твърде много термини и вече не е възможно ръчно. Например за (c1*x1+c2*x2+c3)
и n=2
, което искам е следното.
>> p=[2 5]
p =
2 5
>> syms c1 c2 c3
>> syms x1 x2
>> expression= p(1)*(c1*x1+c2*x2+c3)^2 + p(2)*(c1*x1+c2*x2+c3);
>> expand(expression)
ans =
2*c1^2*x1^2 + 4*c1*c2*x1*x2 + 4*c1*c3*x1 + 5*c1*x1 + 2*c2^2*x2^2 + 4*c2*c3*x2 + 5*c2*x2 + 2*c3^2 + 5*c3
>> F=[5*x1 5*x2 5 4*x1*x2 4*x1 4*x2 2*x1^2 2*x2^2 2]
F =
[ 5*x1, 5*x2, 5, 4*x1*x2, 4*x1, 4*x2, 2*x1^2, 2*x2^2, 2]
>> g=[c1 c2 c3 c1*c2 c1*c3 c2*c3 c1^2 c2^2 c3^2]."
g =
c1
c2
c3
c1*c2
c1*c3
c2*c3
c1^2
c2^2
c3^2
>> expand(F*g)
ans =
2*c1^2*x1^2 + 4*c1*c2*x1*x2 + 4*c1*c3*x1 + 5*c1*x1 + 2*c2^2*x2^2 + 4*c2*c3*x2 + 5*c2*x2 + 2*c3^2 + 5*c3
Намерих следното въпрос и изглежда, че може да има начин да го направите автоматично, използвайки conv
и т.н. Ако човек може да излезе с автоматизирано решение (или поне някаква идея за подобна автоматизация) за случая, където x=(x1,x2) and c=(c1,c2,c3) and n=2
, случаят, изобразен по-горе; Предполагам, че може би ще успея да го обобщя на случаи с по-голям размер.
Забележка: подреждането на термини във F или g няма значение, като се има предвид, че те са подредени по някакъв структуриран начин.
Отговори:
2 за отговор № 1Коефициентите от различни термини не се припокриват. Първият член, p(1)*(c"*x)^1
, има само термини от степен 1 инча xi
и ci
, и така нататък. Така че става въпрос за изчисляване на коефициентите на един термин в даден момент.
Това също има "прост" израз:
p(k)*(c"*x)^k = sum(i1,..,im>=0 with sum(i_)=k)
M(k;i1,..,im)*x1^i1*...*xm^im * c1^i1*...*cm^im
където сумирането е такова, че сумата от всички i
равно на k
, и M
е мултиномиален коефициент.
За m=3
, n=2
, i
"е в реда на вашия пример: 110,101,011,200,020,002
, M (2; 110) = 2, така че първият термин е `p (2) * M (2; 110) * x1 * x2 = 4 * x1 * x2".
Вашите F и g условия са:
F(...) = p(k)*M(k;i1,..,im)*x1^i1*...*xm^im
g(...) = c1^i1*...*cm^im