symbolic icon indicating copy to clipboard operation
symbolic copied to clipboard

SymPy collect function is not implemented

Open necr0potenc3 opened this issue 4 years ago • 2 comments

Collect function is used to collect common powers of a variable in an expression and has the syntax "collect(expr, var)".

Documentation: https://docs.sympy.org/latest/tutorial/simplification.html#collect

Proposal for implementation of collect.m:

function y = collect(expr, var)

cmd = { '(expr, var) = ins' 'return sympy.collect(expr, var),' }; y = pycall_sympy_ (cmd, sym(expr), sym(var));

end

necr0potenc3 avatar Apr 22 '20 01:04 necr0potenc3

My attempt:

%% Copyright (C) 2014, 2016-2019 Colin B. Macdonald
%%
%% The symbolic-2.9.0 package does not support the SymPy collect function.
%% This code is copied from octave/packages/symbolic-2.9.0/@sym/factor.m

%%
%% OctSymPy is free software; you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published
%% by the Free Software Foundation; either version 3 of the License,
%% or (at your option) any later version.
%%
%% This software is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty
%% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
%% the GNU General Public License for more details.
%%
%% You should have received a copy of the GNU General Public
%% License along with this software; see the file COPYING.
%% If not, see <http://www.gnu.org/licenses/>.

%% -*- texinfo -*-
%% @documentencoding UTF-8
%% @deftypemethod  @@sym {@var{e} =} collect (@var{f}, @var{x})
%% Collect common powers of a term in an expression.
%%
%% An example of collecting terms in a polynomial:
%% @example
%% @group
%% syms x y z
%% e = collect([x*y + x - 3 + 2*x^2 - z*x^3 + x^3], x)
%%   @result{} (sym) x^3⋅(1 - z) + 2⋅x^2  + x⋅(y + 1) - 3
%% @end group
%% @end example
%%
%% @seealso{@@sym/expand}
%% @end deftypemethod


function e = collect(f, varargin)
  
  if (nargout > 1)
    print_usage ();
  endif

  f = sym(f);
  for i = 1:length(varargin)
    varargin{i} = sym(varargin{i});
  endfor
  
  e = pycall_sympy__ ('return collect(*_ins)', f, varargin{:});

endfunction

%!test syms x y z
%! f = [x*y + x - 3 + 2*x^2 - z*x^3 + x^3]
%! assert( logical (collect(f,x) == ((x^3)*(1 - z) + 2*(x^2)  + x*(y + 1) - 3)))

robertgj avatar Aug 26 '20 13:08 robertgj

just noting that this patch was reported at the octave bug tracker at https://savannah.gnu.org/bugs/?59014, which could be closed if this code solves the problem.

NRJank avatar Nov 24 '20 21:11 NRJank

xref #215

cbm755 avatar Jan 03 '24 04:01 cbm755