2015-06-07 2 views
3

Я пытался создать массив symfun, так что я могу позже получить доступ к этим функциям и выполнять diff операции WRT к конкретным переменным, я искал и нашел код, как:Matlab: создание массива symfun

syms x 
f = symfun([x1^2+x2-x3; x2+x3^2; x1*x2], x); 

но это не то, что я ищу, это фрагмент кода создает symfun из массива, но мне нужно создать массив symfun. Так что, если у меня есть nsymfun хранятся в массиве, а также n переменные, хранящиеся в массиве, то нужно создать матрицу со следующим правилом:

[[diff(func_1, x1) diff(func_1, x2) ...... diff(func_1, xn)] 
[diff(func_2, x1) diff(func_2, x2) ...... diff(func_2, xn)] 
    . 
    . 
    . 
    . 
[diff(func_n, x1) .......................... diff(func_n, xn)]] 

И вот мой код:

function[K] = bigPopaPump() 
x1 = sym('x1') 
x2 = sym('x2') 
f1 = symfun(3*x1+2, x1) 
f2 = symfun(8*x2+5, x2) 
funcs = [f1, f2] 
xess = [x1, x2] 
dummy_array = zeros(2, 2) 
for i = 1:size(funcs) 
    for j = 1:size(funcs) 
     dummy_array(i, j) = diff(funcs(i), xess(j)); 
    end 
end 
display dummy_array 
end 

ответ

1

Я предполагаю, что вы имеете в виду

syms x1 x2 x3 
f = symfun([x1^2+x2-x3; x2+x3^2; x1*x2], [x1 x2 x3]) 

который возвращает

f(x1, x2, x3) = 

x1^2 + x2 - x3 
     x3^2 + x2 
      x1*x2 

Аналогично, это возвращает идентичный результат:

syms x1 x2 x3 
f = [symfun(x1^2+x2-x3, [x1 x2 x3]); 
    symfun(x2+x3^2, [x1 x2 x3]); 
    symfun(x1*x2, [x1 x2 x3])] 

Если вы хотите массив symfun «s, то вам нужно использовать cell array. Причиной этого является то, что symfun является функциональным дескриптором. Нужно также use cell arrays rather than arrays to group function handles.

Для примера:

syms x1 x2 x3 
f = {symfun(x1^2+x2-x3, [x1 x2 x3]); 
    symfun(x2+x3^2, [x1 x2 x3]); 
    symfun(x1*x2, [x1 x2 x3])} 

или

syms x1 x2 x3 
f = arrayfun(@(fx)symfun(fx,[x1 x2 x3]),[x1^2+x2-x3; x2+x3^2; x1*x2],'UniformOutput',false) 

возвращает

f = 

    [1x1 symfun] 
    [1x1 symfun] 
    [1x1 symfun] 

Вы можете оценить первую функцию, например, с помощью f{1}(2,3,4).

См. Также this related question.