【问题标题】:Get coefficients of symbolic polynomial in Matlab在Matlab中获取符号多项式的系数
【发布时间】:2014-02-13 20:33:31
【问题描述】:

我有一个 Matlab 函数,它返回以下形式的多项式:

poly = ax^2 + bx*y + cy^2

其中 a、b 和 c 是常量,x 和 y 是符号(sym 类)。

我想以[a b c] 的形式获取多项式的系数,但我遇到了以下问题。如果函数返回poly = y^2,则返回coeffs(poly) = 1。我不想要这个——我想要它返回[0 0 1]

如何创建一个函数,以我想要的形式给出符号多项式的系数?

【问题讨论】:

    标签: matlab polynomial-math symbolic-math binomial-coefficients


    【解决方案1】:

    如果您的多项式是单个变量的函数,例如您的示例 y^2,则可以使用 sym2poly

    syms y
    p = 2*y^2+3*y+4;
    c = sym2poly(p)
    

    返回

    c =
    
         2     3     4
    

    如果您真的想要其他顺序的系数,请使用fliplr(c)。如果您要使用多项式,最好不要创建一个名为 poly 的变量,这是您可能要使用的函数的名称。

    如果您确实需要处理多个变量中的多项式,您可以使用 Matlab 中的MuPAD 函数。以下是如何使用 MuPAD 的 coeff 来根据它们之前的变量顺序(xy)获取系数:

    syms x y
    p = 2*x^2+3*x*y+4*y;
    v = symvar(p);
    c = eval(feval(symengine,'coeff',p,v))
    

    如果您想从多项式中提取所有信息,poly2list 函数非常有用:

    syms x y
    p = 2*x^2+3*x*y+4*y;
    v = symvar(p);
    m = eval(feval(symengine,'poly2list',p,v));
    c = m(:,1); % Coefficients
    degs = m(:,2:end); % Degree of each variable in each term
    

    然后可以通过以下方式重构多项式:

    sum(c.*prod(repmat(v,[size(m,1) 1]).^degs,2))
    

    顺便说一句,你上学的好选择。 :-)

    【讨论】:

    • 嗨@horchler,使用 Matlab R2019a 会出现以下错误:Error using mupadengine/feval (line 195) Invalid number of arguments. R2019a 的文档表明这应该可以工作,但是(请参阅您发布的链接)。我只能让它用m = eval(feval(symengine,'poly2list',p)); 运行函数,但我正在处理大量变量,我想要一个特定的系数顺序。有什么想法吗?
    • @MattG:看起来问题可能是poly2list 不再自动将符号数组v 转换为字符串。作为一种解决方法,您可以手动转换为字符串:vc=char(v);m=eval(feval(symengine,'poly2list',p,vc(9:end-2)));。这可能是一个错误,因为 MuPAD 的 coeff 似乎没有这个问题。
    • 感谢您的提示!我最终在这个 Matlab Central 问题中找到了解决方案:mathworks.com/matlabcentral/answers/…
    【解决方案2】:

    这个问题还有一个替代方案。对于给定的度数,此函数返回该度数的多项式及其系数。我们开始:

     function [polynomial, coefficeint] = makePoly(degree)
     syms x y 
     previous  = 0 ;
     for i=0:degree
         current = expand((x+y)^i);
         previous= current +  previous  ;   
     end
      [~,poly] = coeffs(previous);
     for j= 1:length(poly)
         coefficeint(j) = sym(strcat('a', int2str(j)) );
     end
     polynomial = fliplr(coefficeint)* poly.' ;
     end
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多