Вектор полиномов, каждый из которых определен как функция - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь получить вектор полиномов, но внутри этого вектора каждый полином определен функцией в 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].

Есть ли способ сделать это довольно аккуратно?


Обновление:

У меня есть функция, которая принимает полином от двух переменных (скажем, х и у) , заменяет одну из этих переменных (скажем, 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, я не могу придумать какой-либо другой способ go о попытке решить эту проблему.

Есть идеи?

1 Ответ

1 голос
/ 05 февраля 2020

Встроенная функция 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 как побочный эффект, который нежелателен, поэтому лучше использовать анонимные функции.

...