Могу ли я определить функцию максимума f (x), которая присваивается аргументу x - PullRequest
2 голосов
/ 26 апреля 2019

Извините за основной вопрос, но довольно сложно найти слишком много дискуссий о специфике Maxima.

Я пытаюсь выучить некоторые Maxima и хотел использовать что-то вроде

x:2
x+=2

который, насколько я могу судить, не существует в Maxima.Затем я обнаружил, что могу определять свои собственные операторы как инфиксные операторы, поэтому я попытался выполнить

infix("+=");
"+=" (a,b):= a:(a+b);

Однако это не работает, как будто я сначала устанавливаю x:1, а затем пытаюсь вызвать x+=2,функция возвращает 3, но если я проверяю значение x, я вижу, что оно не изменилось.

Есть ли способ достичь того, что я пытался сделать в Maxima?Кто-нибудь может объяснить, почему определение, которое я дал, терпит неудачу?

Спасибо!

1 Ответ

2 голосов
/ 26 апреля 2019

Проблема с вашей реализацией состоит в том, что слишком много и слишком мало вычислений - функция += не видит символ x, поэтому она не знает, какой переменной присваивать результат, илевая часть задания не оценивается, поэтому += считает, что оно присваивает a, а не x.

. Вот один из способов получить правильное количество оценки.::= определяет макрос, который является просто функцией, которая цитирует свои аргументы и для которой возвращаемое значение вычисляется снова.buildq - это функция подстановки, которая цитирует выражение, в которое вы подставляете.Таким образом, комбинация ::= и buildq здесь состоит в том, чтобы создать выражение x: x + 2 и затем оценить его.

(%i1) infix ("+=") $
(%i2) "+="(a, b) ::= buildq ([a, b], a: a + b) $
(%i3) x: 100 $
(%i4) macroexpand (x += 1);
(%o4)                       x : x + 1
(%i5) x += 1;
(%o5)                          101
(%i6) x;
(%o6)                          101
(%i7) x += 1;
(%o7)                          102
(%i8) x;
(%o8)                          102

Так что, безусловно, это можно сделать, если вы хотите это сделать.Но могу я предложить, может быть, вам это не нужно?Изменение переменной усложняет умственное отслеживание происходящего.Политика программирования, такая как разовое назначение, может облегчить программисту понимание программы.Это часть общего подхода, называемого функциональным программированием;возможно, вы можете взглянуть на это.Maxima имеет различные функции, которые позволяют использовать функциональное программирование, хотя вы не обязаны их использовать.

...