Как использовать значение переменной в Maple

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

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

и выход

Вывод клена

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

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

person Paul Stevenson    schedule 07.04.2020    source источник


Ответы (1)


Ваша проблема в том, что вы пытаетесь использовать значения для 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]
person acer    schedule 07.04.2020
comment
Спасибо за ответ и все дополнения (включая уроки номенклатуры). Это то, что я хотел, а затем некоторые ???? - person Paul Stevenson; 07.04.2020