Optimization 使Maxima代码运行更快(收敛半径)

Optimization 使Maxima代码运行更快(收敛半径),optimization,maxima,Optimization,Maxima,我试图找到一些泰勒级数的收敛半径,这些级数与应用于Mandelbrot集的牛顿方法有关。为此,我编写了一些Maxima代码;计算的R至少对于第一个注释的情况是不正确的(1/inf,而不是1/2),因此我试图打印一些值以查看它在数值上的行为。然而,Maxima花费了太多的时间(第一个值为1秒,第二个值为17秒,我放弃了等待第三个值)。第三种情况下的性能更慢。我怎样才能加快速度呢 f(c, z) := z^2 + c; /* h(c) := f(c, f(c, 0)); /* simpler cas

我试图找到一些泰勒级数的收敛半径,这些级数与应用于Mandelbrot集的牛顿方法有关。为此,我编写了一些Maxima代码;计算的
R
至少对于第一个注释的情况是不正确的(
1/inf
,而不是
1/2
),因此我试图打印一些值以查看它在数值上的行为。然而,Maxima花费了太多的时间(第一个值为1秒,第二个值为17秒,我放弃了等待第三个值)。第三种情况下的性能更慢。我怎样才能加快速度呢

f(c, z) := z^2 + c;
/* h(c) := f(c, f(c, 0)); /* simpler case is much faster */ */
h(c) := ratsimp(f(c, f(c, f(c, 0))) / f(c, 0)); /* polynomial with roots at period 3 components */
/* h(c) := ratsimp(f(c, f(c, f(c, f(c, 0)))) / f(c, f(c, 0))); /* next case is much slower */ */
hh(c) := ratsimp(diff(h(c), c));
N(z) := ratsimp(z - h(z) / hh(z)); /* Newton's method */
M(z) := ratsimp(subst(c = c + z, N(c)) - c); /* perturbed */
for ct in allroots(h(c) = 0) do
(
  print(ct),
  /* coefficient of Taylor series */
  a(n) := at(diff((subst(lhs(ct) = bfloat(rhs(ct)), M(z))), z, n) / factorial(n), z = 0),
  R : 1 / limit(abs(a(n+1)/a(n)), n, infinity), /* radius of convergence */
  print(R), /* prints 1/inf, but this is incorrect at least for the first commented case */
  print(bfloat(1 / abs(a(11)/a(10)))), /* prints after 1 second */
  print(bfloat(1 / abs(a(101)/a(100)))), /* prints after 17 seconds */
  print(bfloat(1 / abs(a(1001)/a(1000)))) /* gave up waiting */
);
< > > >编辑> <强>改正<代码>无穷大> /代码> VS>代码> INF混淆,请考虑第一个注释案例<代码> h(c)=f(c,f(c,0))=c^ 2+c</代码>。然后
M(z)=(z^2-h(c))/(2*z+2*c+1)
对于根
c=0
给出
M(z)=z^2/(1-(-2*z))
这是几何级数的和
z^2(1+(-2)*z+(-2)^2*z^2+…+(-2)^n z^n+…)
。现在系数
a(n)=(-2)^n
so
1/极限(abs(a(n+1)/a(n)),n,inf)
应该是
1/2
,但Maxima报告了一个除以零的值:

f(c, z) := z^2 + c;
h(c) := f(c, f(c, 0));
hh(c) := ratsimp(diff(h(c), c));
N(z) := ratsimp(z - h(z) / hh(z));
M(z) := ratsimp(subst(c = c + z, N(c)) - c);
for ct in solve(h(c) = 0) do
(
  print(ct),
  a(n) := at(diff((subst(lhs(ct) = bfloat(rhs(ct)), M(z))), z, n) / factorial(n), z = 0),
  invR : limit(abs(a(n+1)/a(n)), n, inf),
  print(abs(a(10+1)/a(10))),
  print(abs(a(100+1)/a(100))),
  print(abs(a(1000+1)/a(1000))),
  print(invR)
);
哪张照片

...
c = - 1 
`rat' replaced -1.0B0 by -1/1 = -1.0B0
`rat' replaced -1.0B0 by -1/1 = -1.0B0
2.0b0 
2.0b0 
2.0b0 
0 
c = 0 
`rat' replaced 1.0B0 by 1/1 = 1.0B0
`rat' replaced 1.0B0 by 1/1 = 1.0B0
2.0b0 
2.0b0 
2.0b0 
0 

我想用数值计算其他例子的高阶项,看看它是如何表现的,因为极限似乎没有正确计算。但我的Maxima代码太慢,无法实现这一点,虽然SymPy在第3周期(立方)情况下表现良好(见链接问题),但在第4周期(6度)中也需要太长时间。

嗨,克劳德,据我所知,Maxima似乎需要计算第n阶导数(和(n+1)阶导数)而这些衍生品正变得越来越复杂。也许你可以通过为一些小的n值打印出a(n+1)/a(n)来了解问题所在。看起来abs(a(n+1)/a(n))只是一个数字,所以至少最终结果很简单。也许在a(n)或a(n+1)/a(n)中有一种模式可以使计算abs(a(n+1)/a(n)变得容易。顺便说一句,极大值区分了复杂无限的
无穷大和真实无限的
inf
。对于实变量变为无穷大的极限,您需要
limit(…,inf)
@RobertDodier我已经用一个手工计算极限的工作示例更新了这个问题。