Компания ALT Linux
Опубликован: 24.03.2015 | Доступ: свободный | Студентов: 553 / 138 | Длительность: 19:00:00
Лекция 4:

Численные методы и программирование с Maxima

4.2 Ввод-вывод в пакете Maxima

В этом разделе рассматриваются конструкции, позволяющие осуществить обмен данными между Maxima и другими приложениями.

4.2.1 Ввод-вывод данных в консоли

Основная функция для считывания вводимых пользователем данных: read(expr_1,... ,expr_n). Вводимые выражения expr_1,expr_2,... при вводе интерпретируются. Поля ввода разделяются точками с запятой или знаком $. Аргументы функции read могут включать подсказку.

Пример:

(%i1)	a:42$
(%i2)	a:read("Значение a = ",a," введите новую величину")
;
Значение a = 42 введите новую величину (p+q)^3;
(\%o2)\quad {\left( q+p\right) }^{3}
(%i3)	display(a);
a={\left( q+p\right) }^{3}\\
(\%o3)\quad done

Аналогичная функция readonly осуществляет только ввод данных (без их интерпретации).

Пример (сравнение использования функций read и readonly):

(%i1)	a:7$
(%i2)	readonly("Введите выражение:");

Введите выражение: 2^a;
(\%o2)\quad {2}^{a}
(%i3)	read("Введите выражение:");

Введите выражение: 2^a;
(\%o3)\quad 128

Вывод на экран осуществляется функцией display. Синтаксис её вызова: display(expr_1,expr_2,...).

Выражения из списка аргументов выводятся слева направо (сначала само выражение, а затем после знака равенства — его значение).

Аналогичная функция disp (синтаксис вызова: disp( expr+1, expr+2,...)) выводит на экран только значение выражения после его интерпретации.

Функция grind осуществляет вывод в консоль Maxima аналогично disp, но в форме, удобной для ввода с клавиатуры.

(%i1)	a:1$ b:2$ c:3$
(%i4)	display(a,b,c);
a=1\\
b=2\\
c=3\\
(\%o4)\  done
(%i5)	disp(a,b,c);
1\\
2\\
3\\
(\%o5)\  done
(%i6)	grind(a);
1\\
(\%o6)\  done

Управление консольным вводом/выводом осуществляется посредством установки флагов display2d, display_format_internal и т.п.

Вывод на экран длинных выражений по частям (одна часть над другой) осуществляется функцией dispterms (синтаксис вызова: dispterms(expr)).

Кроме того, для вывода результатов вычислений используется функция print. Синтаксис вызова: print(expr_1,... ,expr_n). Выражения expr_1,... ,expr_n интерпретируются и выводятся последовательно в строчку (в отличие от вывода, генерируемого функцией display). Функция print возвращает значение последнего интерпретированного выражения.

Пример:

(%i1)	a:1$ b:2$ c:(a^2+b^2)$
(%i4)	rez:print("Пример:",a,b,c);

Пример: 1 2 5
(\%o4)\  5
(%i5)	rez;
(\%o5)\  5
(%i6)	display("Пример:",a,b,c);

Пример:=Пример:
a=1\\
b=2\\
c=5\\
(\%o6)\  done

4.2.2 Файловые операции ввода-вывода

4.2.2.1 Ввод-вывод текстовых данных

Сохранение текущего состояния рабочей области Maxima осуществляется при помощи функции save. Эта функция позволяет сохранить в файле отдельные объекты с указанными именами. Варианты вызова save1Не забудьте, что имя файла должно быть строкой и заключено в прямые кавычки, например: save("foo.l", all)$, или вычислено в свое строковое значение с помощью двух одинарных кавычек: s:"foo.l"$ save(''s,all)$.:

save(filename,name_1,name_2,name_3,...) — сохраняет текущие значения переменных name_1,name_2,name_3,... в файле filename. Аргументы должны быть именами переменных, функций или других объектов. Если имя не ассоциируется с какой-либо величиной в памяти, оно игнорируется. Функция save возвращает имя файла, в который сохранены заданные объекты.

save(filename,values,functions,labels,...) — сохраняет все значения переменных, функций, меток и т.п.

save(filename, [m,n]) — сохраняет все значения меток ввода/вывода в промежутке от m до n (m, n — целые литералы).

save(filename,name_1 = expr_1,...) — позволяет сохранить объекты Maxima с заменой имени expr_1 на имя name_1.

save(filename,all) — сохраняет все объекты, имеющиеся в памяти.

Глобальный флаг file_output_append управляет режимом записи. Если file_output_append = true, результаты вывода save добавляются в конец файла результатов. Иначе файл результата переписывается. Вне зависимости от file_output_append, если файл результатов не существует, то он создаётся.

Данные, сохранённые функцией save, могут быть снова загружены функцией load (см. ниже).

Варианты записи при помощи save могут совмещаться друг с другом (пример: save(filename,aa,bb,cc = 42,functions, [11,17]).

Загрузка предварительно сохранённого функцией save файла осуществляется функцией load(filename).

Аналогичный синтаксис и у функции stringout, которая предназначена для вывода в файл выражений Maxima в формате, пригодном для последующего считывания Maxima.

Синтаксис вызова stringout:\\ stringout (filename, expr_1, expr_2, expr_3, \dots)\\ stringout (filename, [m, n])  \\ stringout (filename, input)\\ stringout (filename, functions)\\ stringout (filename, values)\\

Функция load(filename) вычисляет выражения в файле filename, создавая таким образом переменные, функции, и другие объекты Maxima. Если объект с некоторым именем уже присутствует в Maxima, при выполнении load он будет замещён считываемым. Чтобы найти загружаемый файл, функция load использует переменные file_search, file_search_maxima и file_search_lisp как справочники поиска. Если загружаемый файл не найден, печатается сообщение об ошибке.

Загрузка работает одинаково хорошо для кода на Lisp и кода на макроязыке Maxima. Файлы, созданные функциями save, translate_file, compile_file содержат код на Lisp, а созданные при помощи функции stringout содержат код Maxima. Все эти файлы могут с равным успехом быть обработаны функцией load.\ Load использует функцию loadfile, чтобы загрузить файлы Lisp и batchload, чтобы загрузить файлы Maxima.

Load не распознаёт конструкции :lisp в файлах, содержащих код на Maxima, а также глобальные переменные \_, \_ \_, \%, и \%th, пока не будут созданы соответствующие объекты в памяти.

Функция loadfile(filename) предназначена для загрузки файлов, содержащих код на Lisp, созданные функциями save, translate_file, compile_file. Для задач конечного пользователя удобнее функция load.

Протокол сессии Maxima может записываться при помощи функции writefile (он записывается в формате вывода на консоль). Для тех же целей используется функция appendfile (запись в конец существующего файла). Завершение записи и закрытие файла протокола осуществляется функцией closefile. Синтаксис вызова: writefile(filename), closefile(filename).

4.2.2.2 Ввод-вывод командных файлов

Основная функция, предназначенная для ввода и интерпретации командных файлов — функция batch(filename) Функция batch читает выражения Maxima из файла filename и выполняет их. Функция batch отыскивает filename в списке file_search_maxima. имя файла filename включает последовательность выражений Maxima, каждое из которых должно оканчиваться ; или $. Специальная переменная \% и функция \%th обращаются к предыдущим результатам в пределах файла. Файл может включать конструкции :lisp. Пробелы, табуляции, символы конца строки в файле игнорируются. Подходящий входной файл может быть создан редактором текста или функцией stringout.

Функция batch считывает каждое выражение из файла filename, показывает ввод в консоли, вычисляет соответствующие выражения и показывает вывод также в консоли. Метки ввода назначаются входным выражениям, метки вывода — результатам вычислений, функция batch интерпретирует каждое входное выражение, пока не будет достигнут конец файла. Если предполагается реакция пользователя (ввод с клавиатуры), выполнение batch приостанавливается до завершения ввода. Для остановки выполнения batch-файла используется Ctrl-C.

Функция batchload(filename) считывает и интерпретирует выражения из командного файла, но не выводит на консоль входных и выходных выражений. Метки ввода и вывода выражениям, встречающимся в командном файле, также не назначаются. Специальная переменная \% и функция \%th обращаются к предыдущим диалоговым меткам, не имея результатов в пределах файла. Кроме того, файл filename не может включать конструкции :lisp.