在 sage 中定义变量族

Defining a family of variables in sage

我正在尝试将我的脚本从 Mathematica 迁移到 Sage。我被困在看似初级的东西中。

我需要处理任意大的多项式,例如

a00 + a10*x + a01*y + a20 *x^2 + a11*x*y + ...

我只认为它们是 x 和 y 上的多项式,我需要给定这样的多项式 P 才能得到它的单项式列表。

例如 P = a20*x^2 + a12*x*y^2 我想要一个 [a20*x^2,a12*x*y^2].

形式的列表

我发现 sage 中的多项式有一个称为系数的 class 函数,returns 系数和一个称为单项式的 class 函数,returns 没有单项式系数。将这两个列表相乘,得到我想要的结果。

问题是为了使它起作用,我需要将所有 a 显式声明为变量,但这并不总是可行的。

有什么方法可以告诉 sage a[number][number] 形式的任何东西都是变量?或者有什么方法可以在 sage 中定义整个变量族?

在一个完美的世界中,我想让 sage 表现得像 mathematica,因为任何没有定义的东西都被认为是一个变量,但我想这太乐观了。

您几乎肯定需要一些非常小的字符串处理;答案

比我能说的都好。当然,这是可以实现的,但是...

In a perfect world I would like to make sage behave like mathematica, in the sense that anything which is not defines is considered a variable, but I guess this is too optimistic.

是的;事实上,这违背了 Python(因此也违背了 Sage 的)"explicit is better than implicit" 的理念;很长一段时间以来,关于 x 是否应该预定义为符号变量的争论一直存在(确实如此!)。

(老实说,考虑到我经常打错字,我真的宁愿不要将任何任意的东西视为符号变量。)

我的回答并未完全解决您的问题,但我发现定义变量的一个技巧是使用 PolynomialRing()。例如:

sage: R = PolynomialRing(RR, 'c', 20)
sage: c = R.gens()
sage: pol=sum(c[i]*x^i for i in range(10));pol
c9*x^9 + c8*x^8 + c7*x^7 + c6*x^6 + c5*x^5 + c4*x^4 + c3*x^3 + c2*x^2 + c1*x + c0

以后你可以将它们定义为变量来解决(),例如:

sage: variables=[SR(c[i]) for i in srange(0,len(eq_list))];
sage: solution = solve(eqs,variables);