Attached is a little package which converts a stream of coefficients
of a Taylor series into continuous C-fraction. This package is
somewhat releated to PadeApproximants, but I was unable to use
PadeApproximants to do what I wanted, so I created a new package.
This package takes a stream of coefficient as an argument.
Mathematically it would be nicer to take Taylor series, but
current limitations on constants in types means that version
using Taylor series would be harder to write and use.
A the example I wanted is:
st1 := coefficients(taylor(exp(x), x = 0))::Stream(FRAC(INT))
pCF := PadeContinuousFraction(FRAC(INT), 'x)
pade_cf(st1, monomial(1, 1))$pCF
(actually, I needed stream of coefficients of continuous C-fraction
but the above is slightly nicer to look at).
I plan to include it.
--
Waldek Hebisch
--
You received this message because you are subscribed to the Google Groups
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/fricas-devel/aE351_lkoycILTn-%40fricas.org.
)abbrev package PADECF PadeContinuousFraction
++ Author: W. Hebisch
++ References:
++ A. Sokal, A simple algorithm for expanding a power series
++ as a continued fraction, arXiv:206.15434v2
++ Description:
++ This package computes expansion into continuous C-fraction
++ using Euler-Viskovatov method.
PadeContinuousFraction(F : Field, xs : Symbol) : Exports == Implementation
where
R ==> UnivariatePolynomial(xs, F)
STF ==> Stream(F)
STR ==> Stream(R)
CFR ==> ContinuedFraction(R)
Exports ==> with
pade_stream : (STF, R) -> STR
++ pade_stream(f, x) produces stream of coefficients of
++ continuous C-fraction in variable x corresponding to Taylor
++ series with coefficients f.
pade_stream2 : (STF, STF, R) -> STR
++ pade_stream(f, g, x) produces stream of coefficients of
++ continuous C-fraction in variable x corresponding to quotient
++ \spad{n/d} of Taylor series n (d respecitively) with
++ coefficients f (g respecitvely).
pade_cf : (STF, R) -> CFR
++ pade_cf(f, x) produces continuous C-fraction in variable x
++ corresponding to Taylor series with coefficients f.
pade_cf2 : (STF, STF, R) -> CFR
++ pade_cf(f, g, x) produces continuous C-fraction in variable x
++ corresponding to quotient \spad{n/d} of Taylor series n
++ (d respecitively) with coefficients f (g respecitvely).
Implementation ==> add
import StreamTaylorSeriesOperations(F)
pade_stream1(st0 : STF, st1 : STF, x : R) : STR == delay
nn : NonNegativeInteger := 1
st2 := st1 - st0
empty?(st2) => error "impossible"
st2 := rst(st2)
repeat
empty?(st2) => empty()$STR
a1 := frst(st2)
if a1 = 0 then
nn := nn + 1
st2 := rst(st2)
iterate
st3 := (1/a1)*st2
st4 := pade_stream1(st1, st3, x)
return concat(a1*x^nn, st4)$STR
pade_stream0(st0 : STF, st : STF, x : R) : STR ==
empty?(st) => error "pade_stream: First term is 0"
b0 := frst(st)
b0 = 0 => error "pade_stream: First term is 0"
st1 := (1/b0)*st
import StreamTaylorSeriesOperations(R)
st2 := -pade_stream1(st0, st1, x)
return concat(b0::R, st2)$STR
pade_stream(st : STF, x : R) : STR ==
st0 := construct([1$F])$STF
pade_stream0(st0, st, x)
pade_stream2(stn : STF, std : STF, x : R) : STR ==
empty?(std) => error "pade_stream2: division by zero"
(b0 := frst(std)) = 0 => error "pade_stream2: division by zero"
pade_stream0((1/b0)*std, b0*stn, x)
pade_cf(st : STF, x : R) : CFR ==
st1 := pade_stream(st, x)
continuedFraction(0, st1, repeating([1$R]))$CFR
pade_cf2(stn : STF, std : STF, x : R) : CFR ==
st1 := pade_stream2(stn, std, x)
continuedFraction(0, st1, repeating([1$R]))$CFR