function [errabs errrel]=symerrcalc(m,varargin)
%
% Cette fonction calcule l'erreur absolue et l'erreur relative sur une valeur m.
%
% prototype: [errabs errrel]=symerrcalc(m,a,b,c,...)
%            m : expression(s) sur la(les)quelle(s) l'erreur doit être déterminée [sym]
%            a,b,c,... : variables dont dépend m [sym]
%
% Version: 0.6 © Joseph Piron 2006
%

clc

if nargin<2
    error('Aucune variable déclarée')
end

errrel=sym(zeros(1,length(m)));
errabs=sym(zeros(1,length(m)));

D=sym(zeros(1,nargin-1));
for i=1:nargin-1
    D(i)=sym(sprintf('D%s',inputname(i+1)));
end

for j=1:length(m)

    for i = 1:nargin-1
        errabs(j)=errabs(j)+abs(diff(m(j),varargin{i}))*D(i);
    end

    fctname=inputname(1);
    if isempty(fctname)
        fctname='La fonction';
    end

    fprintf('%s se formule de la manière suivante:\n',fctname)
    pretty(m(j))
    
    fprintf('L''erreur absolue vaut donc:\n')
    pretty(errabs(j))

    if errabs(j) ~= simplify(errabs(j))
        disp('Ce qui peut se simplifier en:')
        errabs(j)=simplify(errabs(j));
        pretty(errabs(j))
    end

    disp('L''erreur relative est donc donnée par')
    for i = 1:nargin-1
        errrel(j)=errrel(j)+abs(diff(m(j),varargin{i})*varargin{i}/m(j))*abs(D(i)/varargin{i});
    end
    errrel(j)=simplify(errrel(j));
    pretty(errrel(j))
    disp('-------------------------------------------------------------------------------------')
end

