// -*- mode:C++ ; compile-command: "g++ -I.. -g -c intg.cc" -*- /* * Copyright (C) 2000,2014 B. Parisse, Institut Fourier, 38402 St Martin d'Heres * * This program 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 program 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 program. If not, see . */ #ifndef _GIAC_INTG_H #define _GIAC_INTG_H #include "first.h" #include #ifndef NO_NAMESPACE_GIAC namespace giac { #endif // ndef NO_NAMESPACE_GIAC class gen; class identificateur; struct unary_function_ptr; gen complex_subst(const gen & e,const vecteur & substin,const vecteur & substout,GIAC_CONTEXT); gen complex_subst(const gen & e,const gen & x,const gen & newx,GIAC_CONTEXT); vecteur lvarxwithinv(const gen &e,const gen & x,GIAC_CONTEXT); bool is_constant_wrt(const gen & e,const gen & x,GIAC_CONTEXT); bool is_linear_wrt(const gen & e,const gen &x,gen & a,gen & b,GIAC_CONTEXT); bool is_quadratic_wrt(const gen & e,const gen &x,gen & a,gen & b,gen & c,GIAC_CONTEXT); gen linear_apply(const gen & e,const gen & x,gen & remains, GIAC_CONTEXT, gen (* f)(const gen &,const gen &,gen &,const context *)); gen lnabs(const gen & x,GIAC_CONTEXT); extern const unary_function_ptr * const at_surd ; gen surd(const gen & c,int n,GIAC_CONTEXT); gen _surd(const gen & args,GIAC_CONTEXT); // find surd/NTHROOT inside e, set subst1 to list of surd/NTHROOT and subst2 // to replacement by pow void surd2pow(const gen & e,vecteur & subst1,vecteur & subst2,GIAC_CONTEXT); gen invexptoexpneg(const gen& g,GIAC_CONTEXT); bool is_rewritable_as_f_of(const gen & fu,const gen & u,gen & fx,const gen & gen_x,GIAC_CONTEXT); gen firstcoefftrunc(const gen & e); // special version of lvarx that does not remove cst powers vecteur lvarxpow(const gen &e,const gen & x); // Check for hypergeometric e, if true // write e(x+1)/e(x) as P(n+1)/P(n)*Q(x)/R(x+1) bool is_hypergeometric(const gen & e,const identificateur &x,vecteur &v,polynome & P,polynome & Q,polynome & R,GIAC_CONTEXT); // Write a fraction A/B as E[P]/P*Q/E[R] where E[P]=subst(P,x,x+1) // and Q and all positive shifts of R are prime together void AB2PQR(const polynome & A,const polynome & B,polynome & P,polynome & Q, polynome & R); polynome taylor(const polynome & P,const gen & g); // int(ratfrac,x=-inf..inf) bool intgab_ratfrac(const gen & e,const gen & x,gen & value,GIAC_CONTEXT); // integr. of rat. fcns. gen integrate_gen_rem(const gen & e, const gen & x, gen & remains_to_integrate,GIAC_CONTEXT); gen integrate_id_rem(const gen & e, const gen & x, gen & remains_to_integrate,GIAC_CONTEXT,int intmode); // intmode bit 0 is used for sqrt int control, bit 1 control step/step info gen integrate_id_rem(const gen & e, const gen & x, gen & remains_to_integrate,GIAC_CONTEXT); gen linear_integrate(const gen & e,const gen & x,gen & remains_to_integrate,GIAC_CONTEXT); gen integrate_id(const gen & e,const identificateur & x,GIAC_CONTEXT); gen integrate_gen(const gen & e,const gen & f,GIAC_CONTEXT); gen _integrate(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_integrate ; bool tegral(const gen & f,const gen & x,const gen & a,const gen &b,const gen & eps,int nmax,gen & value,GIAC_CONTEXT); double rombergo(const gen & f,const gen & x, const gen & a, const gen & b, int n,GIAC_CONTEXT); double rombergt(const gen & f,const gen & x, const gen & a, const gen & b, int n,GIAC_CONTEXT); gen romberg(const gen & f0,const gen & x0,const gen & a,const gen &b,const gen & eps,int nmax,GIAC_CONTEXT); gen evalf_int(const gen & f0,const gen & x0,const gen & a,const gen &b,const gen & eps,int nmax,bool romberg_method,GIAC_CONTEXT); gen symb_romberg(const gen & a,const gen & b); gen _romberg(const gen & args,GIAC_CONTEXT); gen _gaussquad(const gen & args,GIAC_CONTEXT); gen ggb_var(const gen & f); // return vx_var or the first var in f if vx_var not there extern const unary_function_ptr * const at_romberg; // remove quote inside a maple-like sum/product argument vector // returns true if maple syntax was used bool maple_sum_product_unquote(vecteur & v,GIAC_CONTEXT); // replace x=a..b by x,a,b in the second vector arg bool adjust_int_sum_arg(vecteur & v,int & s); bool rational_sum(const gen & e,const gen & x,gen & res,gen& remains_to_sum,bool allow_psi,GIAC_CONTEXT); gen prodsum(const gen & g,bool isprod); polynome taylor(const polynome & P,const gen & g); bool gosper(const polynome & P,const polynome & Q,const polynome & R,polynome & Y,gen & deno,GIAC_CONTEXT); bool is_hypergeometric(const gen & e,const identificateur &x,vecteur &v,polynome & P,polynome & Q,polynome & R,GIAC_CONTEXT); gen sum(const gen & e,const gen & x,gen & remains_to_sum,GIAC_CONTEXT); gen sum_loop(const gen & e,const gen & x,int i,int j,GIAC_CONTEXT); gen sum(const gen & e,const gen & x,const gen & a,const gen &b,GIAC_CONTEXT); gen _sum(const gen & args,GIAC_CONTEXT) ; gen _Sum(const gen & args,GIAC_CONTEXT) ; gen bernoulli(const gen & x); gen _bernoulli(const gen & args,GIAC_CONTEXT) ; vecteur double2vecteur(const double * y,int dim); // type=0 for seq, 1 for prod, 2 for sum gen seqprod(const gen & g,int type,GIAC_CONTEXT); bool rational_sum(const gen & e,const gen & x,gen & res,gen& remains_to_sum,bool allow_psi,GIAC_CONTEXT); gen sum(const gen & e,const gen & x,gen & remains_to_sum,GIAC_CONTEXT); gen sum(const gen & e,const gen & x,const gen & a,const gen &b,GIAC_CONTEXT); gen _sum(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_sum; gen sum_loop(const gen & e,const gen & x,int i,int j,GIAC_CONTEXT); void decompose_plus(const vecteur & arg,const gen & x,vecteur & non_constant,gen & plus_constant,GIAC_CONTEXT); void decompose_prod(const vecteur & arg,const gen & x,vecteur & non_constant,gen & prod_constant,bool signcst,GIAC_CONTEXT); gen bernoulli(const gen & x); gen _bernoulli(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_bernoulli; // solve dy/dt=f(t,y) with initial value y(t0)=y0 to final value t1 // returns by default y[t1] or a std::vector of [t,y[t]] // if return_curve is true stop as soon as y is outside ymin,ymax // f is eitheir a prog (t,y) -> f(t,y) or a comp [f(t,y) t y] gen odesolve(const gen & t0orig,const gen & t1orig,const gen & f,const gen & y0orig,double tstep,bool return_curve,double * ymin,double * ymax,int maxstep,GIAC_CONTEXT); gen _odesolve(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_odesolve; gen preval(const gen & f,const gen & x,const gen & a,const gen & b,GIAC_CONTEXT); gen _ibpdv(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_ibpdv; gen fourier_an(const gen & f,const gen & x,const gen & T,const gen & n,const gen & a,GIAC_CONTEXT); gen fourier_bn(const gen & f,const gen & x,const gen & T,const gen & n,const gen & a,GIAC_CONTEXT); gen fourier_cn(const gen & f,const gen & x,const gen & T,const gen & n,const gen & a,GIAC_CONTEXT); gen _fourier_an(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_fourier_an ; gen _fourier_bn(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_fourier_bn ; gen _fourier_cn(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_fourier_cn ; void comprim(vecteur & v); #ifndef NO_NAMESPACE_GIAC } // namespace giac #endif // ndef NO_NAMESPACE_GIAC #endif // _GIAC_INTG_H