Создайте вектор символьных переменных по имени через итерацию

Я пытаюсь создать растущий вектор внутри цикла for, т.е. вектор инициализируется одним элементом (назовем его q_1), а на следующей итерации цикла вектор расширяется вторым элементом (назовем его q_2 ) и так далее. Каждый элемент является символическим элементом, зависящим от другого независимого элемента (в моем случае это время t).

Общая идея состоит в том, чтобы создать растущее ОДУ второго порядка, которое я хочу решить и построить в каждом цикле.

Первый шаг, который я уже реализовал, — это цикл for, но мне сложно создать новую символическую переменную внутри цикла. Моей первой идеей было создать переменную по имени, чтобы я мог использовать индекс итерации i цикла и создавать новую уникальную строку в каждом цикле, но я не знаю, как это сделать с Maxima.


person Community    schedule 05.06.2014    source источник
comment
В Matlab это делается с помощью команды sym, например: a = sym('a1').   -  person    schedule 06.06.2014


Ответы (2)


Есть разные способы.

  • используйте индексированные символические переменные, например, u[1], u[2], u[3], ....
  • используйте gensyms (сгенерированные имена символов, которые гарантированно отличаются от любых других существующих символов. Например, gensym() возвращает что-то вроде g4282, затем в следующий раз gensym() возвращает g4283 и т. д.
  • построить символ через concat, например. concat('foo, 3) возвращает foo3. ЭТО РЕШЕНИЕ ПОСЛЕДНЕЙ СРЕДСТВА. ПОПРОБУЙТЕ ЧТО-НИБУДЬ ДРУГОЕ, ПРЕЖДЕ ЧЕМ ОБРАЩАТЬСЯ К CONCAT. Таким образом слишком легко устроить беспорядок.

Если вы покажете код, который у вас есть, возможно, я смогу дать более конкретный совет.

person Robert Dodier    schedule 06.06.2014

Основываясь на принятом ответе, вот пример (с использованием метода concat) цикла for, создающего матрицу M с «индексированными» символами e_ij в качестве элементов:

M: zeromatrix(6,6)$
for r: 1 thru 6 do (
    for c: 1 thru 6 do (
        M[r][c]: concat('e_,r,c)
        )
    )$
person mmj    schedule 15.10.2016