0

Я хочу автоматически вычислять разложения многочленов, где есть переменные (x1, x2, ...), а также коэффициенты (c1, c2, ...). Моя цель состоит в том, чтобы вычислить p(1)*(c1*x1+c2*x2+...)^n+ ... + p(n)*(c1*x1+c2*x2+...)^n .Полиномиальное расширение: разделительные полиномиальные коэффициенты и x's

Как можно заметить, полученное выражение можно записать в виде F(x1,x2...)*g(c1,c2,...) [где Р представляет собой матрицу строк и г есть матрица-столбец], т.е. есть некоторая мультипликативная развязка между коэффициентами и переменными.

Сейчас я использую символический набор инструментов 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 

Я нашел следующее question и, похоже, может быть способ сделать это автоматически, используя conv и т.д. Если можно придумать автоматизированное решение (или, по крайней мере, некоторые идеи к такой автоматизации) для случай, когда x=(x1,x2) and c=(c1,c2,c3) and n=2, дело, изображенное выше; Наверное, я могу обобщить его на более крупные случаи.

Примечание: порядок терминов в F или g не имеет значения, учитывая, что они упорядочены в некотором структурированном виде.

ответ

2

Коэффициенты от разных терминов не пересекаются. Первый термин, 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 является multinomial coefficient.

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 
+0

Спасибо за хороший ответ. Например, для моих аргументов полномочия в g являются '[100,010,001,110,101,011,200,020,002]'. Есть ли хороший способ генерировать этот вид вектора. Для любых 'm' и' n'. – YBE

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