在Matlab中获取符号多项式的系数

4

我有一个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]

我怎样才能创建一个函数,以我想要的形式给出符号多项式的系数?

2个回答

7
您可以使用sym2poly,如果您的多项式是一个单变量函数,就像您的例子y^2一样:
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
1
@MattG:看起来问题可能是poly2list不再自动将符号数组v转换为字符串。作为解决方案,您可以手动转换为字符串:vc=char(v);``m=eval(feval(symengine,'poly2list',p,vc(9:end-2)));。这可能是一个错误,因为MuPAD的coeff似乎没有这个问题。 - horchler
1
谢谢您的提示!我最终在Matlab中央论坛这个问题中找到了解决方案: https://www.mathworks.com/matlabcentral/answers/370283-how-to-use-poly2list-for-specific-variables - MattG

1

此问题还有另一种解决方案。对于给定的次数,该函数返回该次数的多项式及其系数。

 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

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接