#variables #sage
#переменные #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 имеет функцию класса, называемую коэффициентами, которая возвращает коэффициенты, и функцию класса, называемую одночленами, которая возвращает одночлены без коэффициентов. Умножение этих двух списков вместе дает желаемый результат.
Проблема в том, что для того, чтобы это сработало, мне нужно явно объявить все a как переменные с чем-то, что не всегда возможно.
Есть ли какой-либо способ сообщить sage, что что-либо в виде [числа][number] является переменной? Или есть какой-нибудь способ определить целое семейство переменных в sage?
В идеальном мире я хотел бы, чтобы sage вел себя как mathematica, в том смысле, что все, что не определено, считается переменной, но я думаю, это слишком оптимистично.
Ответ №1:
Мой ответ не полностью отвечает на ваш вопрос, но один трюк, который я нашел для определения переменных, заключался в использовании 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);
Ответ №2:
Вам почти наверняка потребуется некоторая незначительная обработка строк; ответы
- этот способ получения списков символьных переменных
- это другой способ их получения, который похож
- этот пост поддержки sage
это лучше, чем все, что я могу сказать. Естественно, это возможно реализовать, но …
В идеальном мире я хотел бы, чтобы sage вел себя как mathematica, в том смысле, что все, что не определено, считается переменной, но я думаю, это слишком оптимистично.
Верно; действительно, это противоречит философии Python (и, следовательно, Sage) «явное лучше неявного»; долгое время шли споры о том, следует ли предопределять even x
как символическую переменную (это так!).).
(И, честно говоря, учитывая, как часто я делаю опечатки, я бы действительно предпочел, чтобы не какая-либо произвольная вещь считалась символической переменной.)
Комментарии:
1. Я поражен, что нет собственного способа сделать это. В любом случае, фрагмент кода на форуме поддержки sage делает свое дело. Спасибо.
2. Пожалуйста. Я думаю, причина, по которой никогда не был реализован собственный способ, заключается в некоторых разногласиях по поводу того, как именно это будет происходить — например, индекс или просто конкатенация, не говоря уже о массиве …