ListLinePlot Mathematica в wxMaxima

У меня есть следующие функции:

P[t_] := P[t] = P[t-1] +a*ED[t-1];
ED[t_] := ED[t] = DF[t] + DC[t];
DF[t_] := DF[t] = b (F - P[t]);
DC[t_] := DC[t] = c (P[t] - F);

И следующие параметры:

a=1;
c=0.2;
b = 0.75;
F=100;

В Mathematica я использую функцию ListLinePlot для построения графиков P[t] и F:

ListLinePlot[{Table[P[t], {t, 0, 25}], Table[F, {t, 0, 25}]}, PlotStyle → {Black, Red},Frame → True, FrameLabel → {"time", "price"}, AspectRatio → 0.4, PlotRange → All]

Как я могу сделать это в wxMaxima? Есть ли аналогичная функция или альтернатива ListLinePlot?

Это моя попытка в wxMaxima:

P[t] := P[t-1] + a * ED[t-1];
ED[t] := DF[t] + DC[t];
DF[t] := b*[F-P[t]];
DC[t] := c*[P[t]-F];

a=1;
c=0.2;
b=0.75;
F=100;

И тогда я попробовал:

draw2d(points(P[t], [t,0,25]))

График функции должен выглядеть следующим образом: введите здесь описание изображения


person Lagrange    schedule 28.12.2020    source источник
comment
К сожалению, сейчас я не могу вдаваться в подробности, но некоторые идеи вы можете рассмотреть. Возможно, что-то из этого вы уже знаете, но тем не менее. Назначение в Maxima — :, а определение функции — :=. Обычные (не запоминающие) функции определяются в круглых скобках, например. f(x) := ..., в то время как так называемые функции массива (запоминание) определяются с помощью квадратных скобок, например. g[x] := .... Вы можете вызвать makelist, чтобы составить список значений. Вы можете составить список с помощью plot2d([discrete, ...]) или draw2d(points(...)). Кстати, похоже, вы говорите F = 100, но тогда F — это функция?? Может быть, вы можете уточнить.   -  person Robert Dodier    schedule 28.12.2020
comment
Спасибо за ваш ответ. Ваши замечания относительно различий между скобками были очень ценны для меня. К сожалению, я до сих пор не понимаю, как строить графики функций. F не является функцией. Это цена (основная цена); цена должна быть нанесена по оси ординат, а время — по оси абсцисс. Я пробовал: draw2d(points(P[t], [t, 0,25], F, [t,0,25]), но это не сработало.   -  person Lagrange    schedule 28.12.2020
comment
Что касается F, все, что я вижу в вашем примере, это F = 100, а затем Table[F, {t, 0, 25}], которые, как я понимаю, создают список элементов для F (0), F (1), F (2), ..., F (25). Итак, мне интересно, как известно значение F (t). Я думаю, что на этом этапе было бы очень полезно, если бы вы обновили свой вопрос, чтобы показать код Maxima, который вы написали до сих пор.   -  person Robert Dodier    schedule 29.12.2020


Ответы (1)


Хорошо, я адаптировал код, который вы показали выше. Это работает для меня. Я работаю с Maxima 5.44 на macOS.

P[t] := P[t-1] + a * ED[t-1];
ED[t] := DF[t] + DC[t];
DF[t] := b*(F-P[t]);
DC[t] := c*(P[t]-F);

a:1;
c:0.2;
b:0.75;
F:100;
P[0]: F + 1;

Pt_list: makelist (P[t], t, 0, 25);

load (draw);
set_draw_defaults (terminal = qt);
draw2d (points_joined = true, points(Pt_list));

Заметки. (1) Должен быть базовый случай для рекурсии на P. Ставлю P[0]: F + 1. (2) Назначения : вместо =. Обратите внимание, что x = y — это символьное уравнение, а не присваивание. (3) Квадратные скобки [ ] предназначены только для индексов и списков. Используйте скобки ( ) для группировки выражений. (4) Синтаксис для draw2d немного другой, я его исправил. (Я установил значение по умолчанию для terminal, так как встроенное значение неверно для Maxima в macOS; если вы работаете в Linux или Windows, вы можете его опустить.)

РЕДАКТИРОВАТЬ: Попробуйте также нарисовать горизонтальную линию.

draw2d (points_joined = true, points(Pt_list),
        color = red, points([[0, F], [25, F]]), 
        yrange = [F - 1, P[0] + 1]);
person Robert Dodier    schedule 29.12.2020
comment
Большое спасибо за ваше прекрасное объяснение! Это поможет мне лучше понять, как работает Maxima. К сожалению, у меня все еще есть проблема: как нарисовать красную линию при y=100? Я попробовал «yline=100» в функции «draw2d», но это не сработало. - person Lagrange; 29.12.2020
comment
Кстати: я получаю следующее сообщение: qt.qpa.fonts: Заполнение псевдонимов семейства шрифтов заняло 304 мс. Замените использование отсутствующего семейства шрифтов Sans существующим, чтобы избежать этих затрат. Ошибка: окно графика (gnuplot_qt) не отвечает - будет перезапущено Это нормально или мне нужно что-то с этим делать? - person Lagrange; 29.12.2020
comment
Я обновил ответ, чтобы показать, как рисовать горизонтальную линию. Что касается сообщения о семействе шрифтов, я предполагаю, что вы работаете над macOS. Проблема в том, что Gnuplot, который Maxima вызывает для создания графиков, говорит, что шрифт по умолчанию — Sans, которого нет в macOS, и нет простого способа обнаружить эту ситуацию в Maxima. Я думаю, что сообщение шрифта безобидно, но не отвечающее окно сюжета звучит более серьезно. Вы на самом деле видите сюжет или нет? - person Robert Dodier; 29.12.2020
comment
Да, я вижу сюжет, и все выглядит нормально. Еще раз спасибо за вашу помощь. Это очень помогло мне лучше понять wxMaxima. - person Lagrange; 29.12.2020