如何在Matlab的公式中分解特定变量?

时间:2018-12-17 17:38:21

标签: matlab symbolic-math

假设我有一个像这样的公式的列向量

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 :(得分:7)

您可以使用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]

答案 1 :(得分:1)

根据@LuisMendo的回答,我使用了image = models.ImageField(default=None, upload_to='profile_pics', null=True, blank=True) 。但是coeffs有两个问题。第一个是它的结果不包含任何为0的系数。第二个是它似乎并不能保证系数的排序与其第二个参数中的变量相同。我想出了以下函数来替换coeffs。

幸运的是,coeffs返回了第二个结果,该结果列出了与第一个结果中的每个项目相关联的变量。 (如果公式不是线性的,则更为复杂。)

coeffs

这仅适用于一个公式,但可以使用@LuisMendo答案中的循环或@Sanchises注释中的该等效表达式将其扩展为向量。

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

我希望有一个更好的答案。