Python 多元多项式合成

Python 多元多项式合成,python,python-3.x,sympy,Python,Python 3.x,Sympy,在变量(x,y)中有一个复多元多项式,我需要通过设置 x = (a+b) / sqrt(2) y = -i (a-b) / sqrt(2) 您可能会将其视为变量从/到复杂坐标的变化 我知道函数“compose”,但它似乎只替换了多项式中的“x”变量,有没有办法进行多元合成 谢谢, Marco也许你的意思是你想把a和b重写成x和y的函数 from sympy.abc import a,b,x,y from sympy import I, sqrt, solve eqs = [ x - (a+b)

在变量(x,y)中有一个复多元多项式,我需要通过设置

x = (a+b) / sqrt(2)
y = -i (a-b) / sqrt(2)
您可能会将其视为变量从/到复杂坐标的变化

我知道函数“compose”,但它似乎只替换了多项式中的“x”变量,有没有办法进行多元合成

谢谢,
Marco

也许你的意思是你想把a和b重写成x和y的函数

from sympy.abc import a,b,x,y
from sympy import I, sqrt, solve
eqs = [
x - (a+b) / sqrt(2),
y - -I* (a-b) / sqrt(2)]
>>> solve(eqs,(a,b))
{a: sqrt(2)*x/2 + sqrt(2)*I*y/2, b: sqrt(2)*x/2 - sqrt(2)*I*y/2}

正如评论中指出的,可以使用该方法同时替换,例如:

导入sympy
a、 b,x,y=符号('a b x y')
多边形=共多边形(x+y)
let={x:(a+b)/sympy.sqrt(2),y:-sympy.I*(a-b)/sympy.sqrt(2)}
新的_poly=poly.subs(let,同时=真)
#此时,“new_poly”是:
#Poly(sqrt(2)*a/2-sqrt(2)*I*a/2+sqrt(2)*b/2+sqrt(2)*I*b/2,
#sqrt(2)*(a+b)/2,-sqrt(2)*I*(a-b)/2,domain='EX')
#因此,以下断言是通过的
assert str(new_poly.gens)='(sqrt(2)*(a+b)/2,-sqrt(2)*I*(a-b)/2)(
新_poly.gens)
断言新的聚合单体()=[(0,0)],新的聚合单体()
#值得一提的是
断言新的_poly.free_符号=={a,b},新的_poly.free_符号
#通过从类“symphy.polys.polytools.Poly”的实例转换`
#类“sympy.core.expr.expr”的实例,以及
#返回类“symphy.polys.polytools.Poly”的实例,
#发电机按预期运行
new_poly=new_poly.as_expr().as_poly()
#就我所知,前面的陈述是等价的,
#对声明:
#`new_poly=sympy.poly(new_poly.as_expr())`
#然而,后者对某些表达式提出了一个例外
#(有关示例,请参见下文)。
#使用表达式方法“as_poly”可以避免此异常。
assert str(new_poly.gens)='(a,b,sqrt(2))',new_poly.gens
断言新的聚合单体()=[(1,0,1),(0,1,1)],新的聚合单体()
断言新的_poly.free_符号=={a,b},新的_poly.free_符号
打印('多项式:{p}'。格式(p=new_poly))
打印('generators:{g}'。格式(g=new_poly.gens))
打印('monomials:{m}'。格式(m=new_poly.monoms())
打印('系数:{c}'。格式(c=new_poly.coefs())
其中打印:

polynomial: Poly((1/2 - I/2)*a*(sqrt(2)) + (1/2 + I/2)*b*(sqrt(2)), a, b, sqrt(2), domain='QQ_I')
generators: (a, b, sqrt(2))
monomials: [(1, 0, 1), (0, 1, 1)]
coefficients: [1/2 - I/2, 1/2 + I/2]
并确保,按照评论中的要求,如果我们从头开始构造新的多项式,则得到的多项式具有我们期望的表达式,即

导入sympy
a、 b=符号('AB')
表达式=(
(1/2-方案一/2)*a*(方案二)
+(1/2+方案I/2)*b*(方案sqrt(2)))
新的多边形=表示为多边形()
assert str(new_poly.gens)='(a,b,sqrt(2))',new_poly.gens
事实上,以这种方式获得的多项式是相等的,但表示方式略有不同,特别是用小数代替分数,即在这种情况下,
new_poly
poly((0.5-i/2)*a*(sqrt(2))+(0.5+i/2)*b*(sqrt(2)),a,b,sqrt(2),domain='EX')

值得注意的是,仅当
poly
是类
symphy.polys.polytools.poly
的实例时,才需要将上述从多项式转换为表达式并返回多项式,如上所述

使用表达式避免了将最终结果从多项式转换为表达式并返回多项式的需要。相反,从表达式到多项式的转换就足够了,如下所示(如果有兴趣调用方法
monoms
,则需要将其转换为多项式,因为表达式是类
sympy.core.expr.expr
,该类没有方法
monoms
):

导入sympy
a、 b,x,y=符号('a b x y')
多边形=x+y
let={x:(a+b)/sympy.sqrt(2),y:-sympy.I*(a-b)/sympy.sqrt(2)}
新的_poly=poly.subs(let,同时=真)
#此时,“new_poly”是
#类'sympy.core.expr.expr`,
#所以它没有“monoms”和“gens”方法,
#因此,需要将其转换为多项式。
#此转换将创建预期的生成器、单项式、,
#和系数,如下所示。
new_poly=new_poly.as_expr().as_poly()
assert str(new_poly.gens)='(a,b,sqrt(2))',new_poly.gens
断言新的聚合单体()=[(1,0,1),(0,1,1)],新的聚合单体()
断言新的_poly.free_符号=={a,b},新的_poly.free_符号
打印('多项式:{p}'。格式(p=new_poly))
打印('generators:{g}'。格式(g=new_poly.gens))
打印('monomials:{m}'。格式(m=new_poly.monoms())
打印('系数:{c}'。格式(c=new_poly.coefs())
这段代码打印的输出与第一段代码相同

并对感兴趣的多项式
x**2+y**2
重复上述两种方法(该多项式在注释中注明):

导入sympy
a、 b,x,y=符号('a b x y')
多边形=共多边形(x**2+y**2)
let={x:(a+b)/sympy.sqrt(2),y:-sympy.I*(a-b)/sympy.sqrt(2)}
新的_poly=poly.subs(let,同时=真)
#此时,“new_poly”是:
#Poly(2*a*b,sqrt(2)*(a+b)/2,-sqrt(2)*I*(a-b)/2,domain='ZZ[a,b]'))
#因此,以下断言是通过的
assert str(new_poly.gens)='(sqrt(2)*(a+b)/2,-sqrt(2)*I*(a-b)/2)(
新_poly.gens)
断言新的聚合单体()=[(0,0)],新的聚合单体()
#值得一提的是
断言新的_poly.free_符号=={a,b},新的_poly.free_符号
#通过从类“symphy.polys.polytools.Poly”的实例转换`
#类“sympy.core.expr.expr”的实例,以及
#返回类“symphy.polys.polytools.Poly”的实例,
#发电机按预期运行
new_poly=new_poly.as_expr().as_poly()
断言str(新的多基因)='(a,b'),新的多基因
断言新的聚合单体()=[(1,1)],新的聚合单体()
断言新的_poly.free_符号=={a,b},新的_poly.free_符号
打印('多项式:{p}'。格式(p=new_poly))
打印('generators:{g}'。格式(g=new_poly.gens))
打印('monomials:{m}'。格式(m=new_poly.monoms())
打印('系数:{c}'。格式(c=new
polynomial: Poly(2*a*b, a, b, domain='ZZ')
generators: (a, b)
monomials: [(1, 1)]
coefficients: [2]