Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабораторныйПрактикум1.pdf
Скачиваний:
395
Добавлен:
02.02.2015
Размер:
4.76 Mб
Скачать

Введите функцию y(x), присвойте ей систему из двух уравнений

« r2 x2 » и «h a x», постройте 2D график для y(x). Увеличьте полотно графика до трети листа, масштабируйте график почти до размера

полотна. Ниже решите систему уравнений: задайте функции «f1(x; y) := x2 + y2 r2» и «f2(x; y):=a x + y h», переменной z1 присвойте

функцию roots( ) с тремя аргументами, в каждый аргумент поместите вектор из двух строк, в первый вектор поместите функции системы «f1(x; y); f2(x; y)», во второй переменные, для которых производится поиск корней «x; y», в третий начальные приближения (по графику) одной из точек «–1; 4». Правее численно выведите значение z1.

Как видно из графика, система имеет два решения. Выбор решения в примере определяется начальным приближением. Выделите мышью последние два блока, передвиньте их ниже при нажатой клавише Ctrl, будет создана копия блоков. Замените в копии z1 на z2, замените значения начальных приближений на «3; –3». Проверьте по графику верность поиска корней.

Сохраните документ как «SM11 пересечение окружности.smz».

12.2.3. Символьные вычисления

SMath Studio по умолчанию использует символьную оптимизацию. Это значит, что при построении формулы выбирается её форма, требующая минимальных затрат ресурсов на вычисление. Для достижения максимальной точности числа (до численного вывода) хранятся в виде (неправильной) дроби. Символьные преобразования позволяют получать новые функции как ряд операций над заданными. Используя оператор символьного вывода (Ctrl+точка) или, что равносильно, включение символьной оптимизации для оператора вывода, можно выводить результат в виде выражения, а не числа.

В новом документе введите «x2», затем оператор символьного вывода

(Ctrl+точка), нажмите Enter.

Вставьте шаблон определённого производной командой «diff(» c использованием списка динамической помощи ввода (форма с двумя аргументами) или кнопкой Дифференцирование группы Функции боковой панели, в шаблон впишите функцию «x2» и переменную дифференцирования «x», выполните символьный вывод. Если вы просто ввели «diff(» и имя функции (неполная запись с одним аргументом), то запись примет вид «f(x)'», для полной записи поместите курсор перед кавычкой и

319

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

Ниже вставьте матрицу 2×2, заполните именами ячеек a1;1, a1;2, a2;1, a2;2, обратите матрицу (возведите её в степень –1), выведите результат в символьном виде:

Символьные преобразования позволяют упростить выражения, введите выражение, представленное ниже и символьно выведите результат. В выражении используется факториал (!).

Как вы видите, выражение хранится в символьном виде, группируя коэффициенты.

Сохраните документ как «SM12 символьные вычисления.smz».

12.2.4. Строковые операции

Кроме чисел и формул переменные могут хранить строки – последовательность символов. Обычно из набора строк формируются сообщения пользователю. Строка не может содержать знак равенства и двойную кавычку. SMath Studio имеет набор функций для манипуляций над строками:

320

concat(аргументы) – возвращает строку, образованную последовательным сцеплением аргументов-строк.

description(имя) – возвращает строку описания указанной переменной или функции. Если идентификатор не определён, возвращает ноль, если не определено описание – пустую строку. Описание может быть скрыто.

findstr(str1;str2) – возвращает вектор индексов положения подстроки str2 в строке str1 или –1 если подстрока не найдена.

IsString(аргумент) – возвращает 1, если аргумент строка, иначе 0. num2str(выражение) – преобразует математическое выражение в строку. str2num(строка) – возвращает математическое выражение, сформиро-

ванное преобразованием из данной строки.

strlen(строка) – возвращает количество символов указанной строки. strrep(стр1; стр2; стр3) – возвращает строку, в которой в строке стр1

все вхождения строки стр2 заменены на стр3. Регистр символов строк имеет значение.

substr(строка; число) – возвращает подстроку из строки, которая начинается с номера символа, заданного числом.

substr(строка; число1; число2) – возвращает подстроку из строки, которая начинается с номера символа, заданного числом1 и имеющую длину число2.

12.2.5. Программирование

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

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

321

долго, SMath Studio выделяет зелёной рамкой вычисляемый блок, при этом в статусной строке отображается общее время вычислений документа. Пользователь может прервать вычисления кнопкой Esc или кнопкой панели инструментов Прервать вычисления (например, для включения численной оптимизации или исправления выражений). Блок, на котором были прерваны вычисления, будет помечен красной рамкой и выведена подсказка «Прервано пользователем».

Важным понятием в программировании является логический тип данных. В SMath Studio в качестве значения истина используется единица, в качестве ложь ноль. Проверьте эти утверждения, в новом документе введите: «1>2=», «1<2=».

Рассмотрите команды программирования, которые участвуют в создании программ в SMath Studio.

line – команда добавления вертикальной линии в программу. Вставляемая вертикальная линия объединяет отдельные операторы в операторный блок с одним входом и одним выходом, который выполняется как единый оператор. Точка с запятой увеличивает линию, добавляя маркеры вода. Изменять размер можно мышью за нижний правый маркер при выделении всех маркеров ввода линии. Удалять пустой маркер ввода в линии можно клавишами Del и Backspace.

while – оператор цикла с предусловием. Выводит служебное слово while с двумя маркерами ввода. В маркер справа while вводится логическое выражение (переменную), управляющее циклом, а в маркер внизу – тело цикла, операторы которого будут выполняться, пока логическое выражение возвращает истина (единицу), любое значение, отличное от единицы прервёт цикл. Так как условие проверяется до выполнения операторов тела цикла (предусловие), операторы тела, в случае ложности условия, могут быть не выполнены ни разу. Если в теле цикла несколько операторов, то они помещаются во вложенную линию. В примере ниже перед циклом задаётся начальное значение счётчика цикла i, в цикле происходит увеличение счётчика на единицу до тех пор, пока он меньше n. Как указывалось в прошлой работе, для ускорения сложных итерационных вычислений используйте функцию eval( ).

322

if – условный оператор, позволяет создавать ветвление. Оператор вставляется шаблоном, также содержащим служебное слово else. После оператора if вводится условие (выражение или переменная). Если условие истинно, то выполняются операторы, находящиеся между строками if и else, а операторы после else игнорируются, иначе выполняются операторы блока else. Других значений в условии кроме истина (1) или ложь (0) не допускается. Очень часто в условии используют операторы сравнения (группа Булева боковой панели). Для инвертирования логического значения используется оператор не (¬), а для объединения нескольких условий используются логические операторы и (˄), или (˅), исключающее или ( ). Если в условном операторе используется только ветка, выполняемая при истинном значении условия (при ложном значении условный оператор ничего не исполняет), то в маркер else можно ввести единицу или ноль. Оператор if можно использовать в качестве функции, присвоив идентификатору. Функция возвращает последнее значение линии соответственно истинного или ложного блока операторов.

for – вводит в программы цикл с параметром. Когда заранее неизвестно количество итераций цикла, удобнее использовать оператор while, когда известно – оператор for. Оператор может быть в двух формах – с тремя и четырьмя аргументами. Оператор for с тремя аргументами вы уже использовали ранее. В строке условия цикла указывается счётчик и задаётся вектор значений с помощью дискретной переменной или другим способом, тело цикла повторяется для

323

каждого значения счётчика, получаемого из вектора. Вторая форма оператора for в заголовке содержит три параметра, а четвёртым является тело цикла. Первый параметр задаёт счётчик цикла и инициализирует его (присваивает) начальным значением, второй параметр содержит условие, при истинности которого цикл повторяется. Третий параметр может содержать несколько операторов, обязательно выполняется в конце итерации цикла, обычно содержит выражение, изменяющее значение счётчика на величину шага. Тело цикла может содержать несколько операторов, причём его операторы также могу изменять значение счётчика цикла. В следующем примере представлены несколько способов нахождения суммы.

break – прерывает цикл, действие передаётся следующему оператору за пределами цикла. Часто используется совместно с условным оператором, определяющим условие для выхода из цикла.

continue – прерывает выполнение текущей итерации цикла и переходит в начало цикла.

trace – оператор вывода промежуточных (отладочных) значений. Используется внутри программы, имеет синтаксис консольного оператора вывода языка программирования C#. Обычно достаточно перечислить имена переменных в списке аргументов. Вывод производится в окно отладки, открываемого командой Вид/Окно вывода. Откройте окно вывода, введите следующий пример:

324

Закройте окно вывода.

error – останавливает выполнение и выводит ошибку, текст которой указан в строке аргумента. Введите «Q := error("Непредвиденная ошибка!")»

Рассмотрите математическую модель простой химической реакции первого порядка A B , (вещество A превращается в вещество B) протекающей в изотермическом режиме (температура постоянна). Условием окончания реакции принимается исчерпание сырья (концентрация меньше 0,05 моль). Константа скорости реакции kA (по веществу A) зависит от природы вещества, но не от его концентрации, единицы измерения константы скорости зависят от порядка реакции. Для реакции первого порядка она записывается как 1/с. Отрицательное значение константы показывает, что вещество разлагается. Начальная концентрация вещества А 1 моль. Концентрация в каждую следующую секунду реакции определяется как разница текущей концентрации и приращения, зависящего от k.

325

Фактически с помощью условного оператора и оператора break организован цикл с постусловием, когда в условие цикла помещается условие для счётчика с заведомо большим количеством итераций (цикл завершается по счётчику в случае ошибки в теле цикла), а завершается оператором break при достижении одного или нескольких условий, проверяемых условным оператором. Иногда с помощью оператора цикла «while 1» организуется «вечный цикл», выход из которого возможен вызовом break в теле цикла.

В качестве следующего примера рассмотрите программу перевода арабского числа в римское.

326