强制最大值认为平方根是虚数

Force maxima to think square root is imaginary

我想看看动态系统的椭圆轨迹如何随着不同的系统参数旋转。所以我尝试了

assume(c<0);
assume(b>0);
assume(b*c<-a^2);
A:matrix([a,b],[c,-a]);
eigenvalues(A);

我得到结果

[[-sqrt(b*c+a^2),sqrt(b*c+a^2)],[1,1]]

不过,我想要

[[-%i*sqrt(a^2+b*c),%i*sqrt(a^2+b*c)],[1,1]]

看来maxima并没有使用我的假设。我怎样才能让它使用这样的假设,还是我需要手动完成?

您可以定义一个简化规则:

(%i1) display2d: false $
(%i2) assume(c<0, b>0, b*c<-a^2) $
(%i3) A:matrix([a,b],[c,-a]) $
(%i4) negp(e):= is(sign(e)='neg) $
(%i5) matchdeclare(NN, negp)     $
(%i6) tellsimpafter(sqrt(NN), -%i*sqrt(-NN)) $
(%i7) eigenvalues(A);
(%o7) [[%i*sqrt((-b*c)-a^2),-%i*sqrt((-b*c)-a^2)],[1,1]]