每个定义为函数的多项式向量
A vector of polynomials each defined as a function
我正在尝试获取多项式向量,但向量中的每个多项式都由 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
、returns:
*** 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 内置的 intnum
函数将表达式而不是函数作为其第三个参数。该表达式可以使用变量 t
。 (几个内置函数的行为是这样的 - 它们不是真正的函数)。
你的int
函数可以定义如下:
int(p)=intnum(t=0, 1, subst(p, y, exp(I*t)))
它以多项式 p
作为参数,然后在需要时用 y
代替。
然后您可以使用 int(x*y)
which returns (0.84147098480789650665250232163029899962 + 0.45969769413186028259906339255702339627*I)*x
'.
同样,您可以将 apply
与多项式向量一起使用。例如:
apply(int, vector(5, n, x^n*y-1))
回到您最初的提议 - 这在技术上并没有错,而且会奏效。我只是不推荐它超过 subst
方法,但也许如果你想对 class 不能表示为多项式的函数执行数值积分。假设 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
定义为不需要的副作用,因此最好使用匿名函数。
我正在尝试获取多项式向量,但向量中的每个多项式都由 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
、returns:
*** 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 内置的 intnum
函数将表达式而不是函数作为其第三个参数。该表达式可以使用变量 t
。 (几个内置函数的行为是这样的 - 它们不是真正的函数)。
你的int
函数可以定义如下:
int(p)=intnum(t=0, 1, subst(p, y, exp(I*t)))
它以多项式 p
作为参数,然后在需要时用 y
代替。
然后您可以使用 int(x*y)
which returns (0.84147098480789650665250232163029899962 + 0.45969769413186028259906339255702339627*I)*x
'.
同样,您可以将 apply
与多项式向量一起使用。例如:
apply(int, vector(5, n, x^n*y-1))
回到您最初的提议 - 这在技术上并没有错,而且会奏效。我只是不推荐它超过 subst
方法,但也许如果你想对 class 不能表示为多项式的函数执行数值积分。假设 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
定义为不需要的副作用,因此最好使用匿名函数。