2010-12-11 6 views
1

Я пытаюсь создать функцию в MATLAB, которая расширяет скобку до степени n, где n - натуральное число. Это то, что я до сих пор:2 переменные в массиве

function expandb = expandb(x,y,n) 
z = my_bincoeff1(n);; 
syms v x y 
v=1:n+1 
for i=1:n+1 
    v(i)=z(i)*x.^(n-i+1)*y.^(i-1); 
end 
a=0 
for i=1+n+1 
    a=a+v(i) 
end 

expandb = a; 

Я получаю эту ошибку, когда я запускаю его:

??? The following error occurred converting from sym to double: 
Error using ==> mupadmex 
Error in MuPAD command: DOUBLE cannot convert the input expression into a double 
array. 
If the input expression contains a symbolic variable, use the VPA function instead. 

Error in ==> expandb at 6 
    v(i)=z(i)*x.^(n-i+1)*y.^(i-1); 

Так как я храню 2 переменные в массиве?

+0

Если 'expandb' функция символических переменных или номер? – Jacob

+0

Должна быть функция из 2 переменных. Предположим, что мне нужно развернуть (2x + 3y)^4, я бы написал expandb (2x, 3y, 4), и ответы были бы в форме (2x)^4 + ... – Mobix

+0

Есть ли причина, по которой вы не хотите использовать функцию [EXPAND] (http://www.mathworks.com/help/toolbox/symbolic/expand.html), т. е. развернуть ((2 * x + 3 * y)^4) ;? – gnovice

ответ

1

Проблема заключается в том, что, даже если вы сначала определить v в качестве символического объекта с помощью SYMS, вы переопределить это будет массив двойных значений на следующей строке. Затем в первой итерации вашего цикла вы индексируете первый элемент v и пытаетесь поместить символическое выражение в этот элемент. Ошибка возникает, когда MATLAB пытается преобразовать символическое выражение в тип double, чтобы соответствовать типу других элементов массива v (чего он не может сделать, потому что в выражении есть неопределенные символические объекты, такие как x и y).

Решение ниже должен выполнить то, что вы хотите:

function v = expandb(x,y,n) 
    z = my_bincoeff1(n); 
    syms v x y 
    v = z(1)*x.^n; %# Initialize v 
    for i = 2:n+1 
    v = v+z(i)*x.^(n-i+1)*y.^(i-1); %# Add terms to v 
    end 
end 
+0

понял это вчера, но спасибо за ваши усилия – Mobix