1

我正在尝试获取多项式向量,但在向量中每个多项式都由 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)中采用多项式,用 exp(I*t) 替换其中一个变量(比如 y),然后在 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定义,我想不出任何其他方法来尝试解决这个问题。

有任何想法吗?

4

1 回答 1

1

PARI 内置intnum函数将表达式而不是函数作为其第三个参数。这个表达式可以利用变量t。(几个内置函数的行为是这样的——它们不是真正的函数)。

您的int函数可以定义如下:

int(p)=intnum(t=0, 1, subst(p, y, exp(I*t)))

它将多项式作为参数p,然后y在需要时替换它。

然后您可以使用int(x*y)which 返回(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为不需要的副作用,因此最好使用匿名函数。

于 2020-02-04T23:54:25.553 回答