[GiNaC-devel] [PATCH] power::series(): handle some (trivial) singularities of the exponent...
Alexei Sheplyakov
alexei.sheplyakov at gmail.com
Mon Nov 8 15:41:06 CET 2010
... so GiNaC can expand expressions like
cos(x)^(sin(x)/x) // (x -> 0)
(1 + x)^(1/x) // x -> 0
and so on.
---
ginac/pseries.cpp | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/ginac/pseries.cpp b/ginac/pseries.cpp
index 4a8d7d6..c290fe0 100644
--- a/ginac/pseries.cpp
+++ b/ginac/pseries.cpp
@@ -1116,6 +1116,29 @@ ex power::series(const relational & r, int order, unsigned options) const
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)))
--
1.7.2.3
More information about the GiNaC-devel
mailing list