Как я могу выделить конкретные переменные из формулы в Matlab? - PullRequest
0 голосов
/ 17 декабря 2018

Предположим, у меня есть вектор-столбец формул, подобных этой

N =

 4*k2 + 5*k3 + k1*x
 7*k2 + 8*k3 + k1*y

, и вектор-столбец символических переменных, подобных этой

k =

 k1
 k2
 k3

Формулы являются линейными относительно k,Я хотел бы найти матрицу M такую, чтобы M*k равнялся N.

Я могу сделать это с N/k.Однако это дает

[ (4*k2 + 5*k3 + k1*x)/k1, 0, 0]
[ (7*k2 + 8*k3 + k1*y)/k1, 0, 0]

, что правильно, но не то, что я хочу.То, что я хочу, это матрица

 x     4     5
 y     7     8

, которая кажется мне самым простым ответом в том смысле, что она не содержит переменных из k.

Как мне убедить Matlab выделять указанные переменныеиз формулы или вектора формул?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

На основании ответа @ LuisMendo я использовал coeffs.Но есть пара проблем с coeffs.Во-первых, его результат не содержит никаких коэффициентов, равных 0. Во-вторых, он не гарантирует, что коэффициенты упорядочены так же, как переменные во втором аргументе.Я придумал следующую функцию для замены коэффициентов.

К счастью, коэффициенты возвращают второй результат, в котором перечислены переменные, связанные с каждым элементом в первом результате.(Это более сложно, если формула не является линейной.)

function m = factorFormula(f, v )
    % Pre: f is a 1x1 sym representing a
    %      linear function of the variables in v.
    % Pre: v is a column vector of variables
    % Post: m is a row vector such that m*v equals f
    %       and the formulas in m do not contain the 
    %       variables in v
    [cx,tx] = coeffs(f,v)
    n = size(v,1)
    m = sym(zeros(1,n))
    for i = 1:n
        j = find(tx==v(i))
        if size(j,2) == 1
            m(i) = cx(j)
        end
    end
end

Это работает только для одной формулы, но ее можно распространить на вектор, используя цикл в ответе @ LuisMendo или это эквивалентное выражение в @Sanchises.комментарий там.

cell2sym(arrayfun( @(f)factorFormula(f,k),N,'UniformOutput',false ) )

Я надеюсь, что есть лучший ответ, чем этот.

0 голосов
/ 17 декабря 2018

Вы можете использовать coeffs, в частности, форму

C = coeffs(p,vars) возвращает коэффициенты многомерного полинома p относительно переменных vars.

Поскольку первый вход должен быть полиномом, вам необходимо передать каждый компонент N:

coeffs(N(1), k)
coeffs(N(2), k)

Или использовать цикл и сохранить все результаты в символьном массиве:

result = sym('result', [numel(N) numel(k)]); % create symbolic array
for m = 1:numel(N)
    result(m,:) = coeffs(N(m), k);
end

В вашем примере это дает

result =
[ 5, 4, x]
[ 8, 7, y]
...