我正在尝试获取多项式的向量,但是在向量内,每个多项式都由Pari中的函数定义。
例如,我希望能够输出这种形式的向量:[f(x) = x-1 , f(x) = x^2 - 1, f(x) = x^3 - 1, f(x) = x^4 - 1, f(x) = x^5 - 1]
vector( 5, n, f(x) = x^n-1)
的简单矢量构造不起作用,输出[(x)->my(i=1);x^i-1, (x)->my(i=2);x^i-1, (x)->my(i=3);x^i-1, (x)->my(i=4);x^i-1, (x)->my(i=5);x^i-1]
。
是否有一种相当整齐的方法?
更新:
我有一个函数,它使用两个变量(例如x和y)的多项式,将其中一个变量(例如y)替换为exp(I * t),然后在t = 0和t = 1之间进行积分,在x中给出一个变量多项式:int(T)=intnum(t=0,1,T(x,exp(I*t)))
由于此定义的方式,我必须明确定义一个多项式T(x,y)=...
,然后计算int(T)
。只需输入多项式,例如int(x*y)-1
,即可返回:
*** at top-level: int(x*y-1)
*** ^----------
*** in function int: intnum(t=0,1,T(x,exp(I*t)))
*** ^--------------
*** not a function in function call
*** Break loop: type 'break' to go back to GP prompt
我希望能够对许多多项式执行此操作,而不必为每个多项式手动键入T(x,y)=...
。我的计划是尝试使用apply
功能进行此操作(因此,将所有多项式都放入向量中-简单的例子就是vector(5, n, x^n*y-1)
)。但是,由于我定义int
的方式,我需要将向量中的每个条目都定义为T(x,y)=...
,这是我最初提出问题的地方。
定义T(x,y)=vector(5, n, x^n*y-1)
似乎对我要计算的内容没有帮助。而且由于int
的定义方式,我想不出任何其他方法来尝试解决此问题。
有什么想法吗?
您的代码没有错。它确实输出函数向量-全部起作用。
PARI将每个函数转换成类似(x)->my(i=1);x^i-1
的形式的事实只是PARI对函数的表示。 (与其他系统不同,PARI不支持符号表达式-仅支持有理函数)。
所以我真的不理解您的问题-如果实际使用这些功能,您会遇到什么问题?
PARI内置intnum
函数将表达式而不是函数作为其第三个参数。该表达式可以使用变量t
。 (几个内置函数的行为是这样的-它们不是实函数)。
您的int
功能可以定义如下:
int(p)=intnum(t=0, 1, subst(p, y, exp(I*t)))
将多项式p
作为参数,然后在需要时用y
代替。
然后您可以使用int(x*y)
返回(0.84147098480789650665250232163029899962 + 0.45969769413186028259906339255702339627*I)*x
'。
类似地,您可以将apply
与多项式向量一起使用。例如:
apply(int, vector(5, n, x^n*y-1))
回到您的原始提案-从技术上讲这没有错,并且可以使用。我只是不建议在subst
方法上使用它,但是如果您想对无法表示为多项式的一类函数进行数值积分,那么也许是不推荐的。假设int
定义为:
int(T)=intnum(t=0,1,T(x,exp(I*t)))
您可以使用语法int((x,y) -> x*y)
调用它。箭头是用于创建匿名函数的PARI语法。 (这是表达式和函数之间的区别-您无法创建自己的函数,其功能类似于PARI内置函数)
您甚至可以将其与功能向量一起使用:
apply(int, vector(5, n, (x,y)->x^n*y-1))
我在这里使用语法(x,y)->x^n*y-1
,它比您在问题中使用的f(x,y)=x^n*y-1
更可取,但是它们基本上是相同的。 (后一种形式也将f
定义为不需要的副作用,因此最好使用匿名函数。