* methods for series expansion. */
/*
- * GiNaC Copyright (C) 1999-2010 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany
*
* 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
epvector * newseq = conjugateepvector(seq);
ex newpoint = point.conjugate();
- if (!newseq && are_ex_trivially_equal(point, newpoint)) {
+ if (!newseq && are_ex_trivially_equal(point, newpoint)) {
return *this;
}
ex result = (new pseries(var==newpoint, newseq ? *newseq : seq))->setflag(status_flags::dynallocated);
- if (newseq) {
- delete newseq;
- }
+ delete newseq;
return result;
}
ex pseries::eval_integ() const
{
- epvector *newseq = NULL;
+ epvector *newseq = nullptr;
for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
if (newseq) {
newseq->push_back(expair(i->rest.eval_integ(), i->coeff));
orderloop++;
real_ldegree = buf.series(r, orderloop, options).ldegree(sym);
} while ((real_ldegree == orderloop)
- && ( factor*real_ldegree < degbound));
+ && (factor*real_ldegree < degbound));
ldegrees[j] = factor * real_ldegree;
degbound -= factor * real_ldegree;
}
must_expand_basis = true;
}
+ bool exponent_is_regular = true;
+ try {
+ exponent.subs(r, subs_options::no_pattern);
+ } catch (pole_error) {
+ exponent_is_regular = false;
+ }
+
+ if (!exponent_is_regular) {
+ ex l = exponent*log(basis);
+ // this == exp(l);
+ ex le = l.series(r, order, options);
+ // Note: expanding exp(l) won't help, since that will attempt
+ // Taylor expansion, and fail (because exponent is "singular")
+ // Still l itself might be expanded in Taylor series.
+ // Examples:
+ // sin(x)/x*log(cos(x))
+ // 1/x*log(1 + x)
+ return exp(le).series(r, order, options);
+ // Note: if l happens to have a Laurent expansion (with
+ // negative powers of (var - point)), expanding exp(le)
+ // will barf (which is The Right Thing).
+ }
+
// Is the expression of type something^(-int)?
if (!must_expand_basis && !exponent.info(info_flags::negint)
&& (!is_a<add>(basis) || !is_a<numeric>(exponent)))
if (x.subs(r) != x)
throw std::logic_error("Cannot series expand wrt dummy variable");
- // Expanding integrant with r substituted taken in boundaries.
+ // Expanding integrand with r substituted taken in boundaries.
ex fseries = f.series(r, order, options);
epvector fexpansion;
fexpansion.reserve(fseries.nops());