Как использовать значение переменной в Maple - PullRequest
1 голос
/ 07 апреля 2020

Как мне заставить Maple дать значение переменной в RHS выражения, а не обрабатывать его как переменную в выражении. В следующем коде я хочу получить список из трех функций x, которые являются квадратичными с различными смещениями, но это не то, что я получаю:

ix := [-1,0,1]:
b := []:
for a in ix
do
  b := [op(b),x->(x-a)^2];
end do;

и вывод равен

Maple output

в то время как я хотел бы, чтобы это было (для последней строки)

b := [ x -> (x+1)^2, x -> x^2, x -> (x-1)^2 ]

1 Ответ

1 голос
/ 07 апреля 2020

Ваша проблема в том, что вы пытаетесь использовать значения для a в построении тела процедуры , а не " RHS выражения ", как вы Заявленный.

Старайтесь не использовать термин "функция" в этом контексте, поскольку он просто запутывает различие между выражением и процедурой.

Вот способ получить значения из ix в качестве замены a в сгенерированном списке процедур с (x-a)^2 в теле.

restart;
ix := [-1,0,1]:

b := []:
for a in ix do
  b := [op(b), unapply((x-a)^2,x)];
end do:
b;

    [x -> (x+1)^2, x -> x^2, x -> (x-1)^2]

Неэффективно создавать списки таким образом, многократно объединяя их. Так как эта практика плохо масштабируется в производительности, вы действительно должны отбросить ее как практику.

Вы можете составить весь список одним вызовом seq.

Flist := [ seq( unapply((x-a)^2,x), a in ix ) ]:

Flist;

    [x -> (x+1)^2, x -> x^2, x -> (x-1)^2]

Здесь, Flist - это список процедур, каждую из которых можно оценить по значению, вызвав его с аргументом.

Flist[1];

              x -> (x+1)^2

Flist[3](3.4);

                  5.76

#plot(Flist, -2..2);

Примечание. Процедуры, отображаемые в виде стрелки x -> ..., называются операторами .

Для забавы, вот эквиваленты, используя выражения ,

Elist := [ seq( (x-a)^2, a in ix ) ]:

Elist;

        [       2   2         2]
        [(x + 1) , x , (x - 1) ]

Elist[1];

                       2
                (x + 1) 

eval(Elist[3], x=3.4);

                  5.76

#plot(Elist, x=-2..2);

Существуют и другие способы генерации процедур со значениями a в теле указывается программно. Команда unapply - не единственный возможный механизм, хотя для вашего примера это самый простой способ.

Другой способ - заменить, например,

generic := x -> (x-_dummy)^2:

Hlist := [ seq( subs(_dummy=a, eval(generic)), a in ix ) ]:

Hlist;

    [x -> (x+1)^2, x -> x^2, x -> (x-1)^2]
...