Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatics.doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.33 Mб
Скачать

5.1. Особенности языка MathCad

Программирование в MathCad в высшей степени упрощено. Массивы определяются либо непосредственно, либо через свои индек-сы. Например, для матрицы Гильберта порядка n Ai,j = сум-му всех скалярных произведений столбцов можно посчитать так: фик-сируем n 10 (например) i 0 . . n - 1 (многоточие можно ввести с клавиатуры знаком " ; ") Ai,j if (i j , 2 , ) , затем вводим Ai A j = "Enter" (см. пример 5 в разд. 9 гл. 1 ).

В основном в программировании эксплуатируется подменю , которое содержит кнопки "Add Line" (введение блоков операторов), " " (оператор присваивания), " if " (вводит условный оператор, не путать с функцией if(), возвращающей альтернативное значение ари-фметического выражения), "otherwise " (альтернатива к условию опе-ратора " if "), " for " (формирование цикла пересчета, служебное слово Step не используется), " While ‹ условие ›" (формирование условного цикла). Так как оператор EXIT отсутствует, то прерывание цикла обес-печивают операторы:

Break - выход из цикла к следующему оператору,

Return - выход из программы,

Continue - переход в начало программы.

Заметно облегчает программирование использование "горячих" кла-виш. Например, клавиша " { " вводит стрелку "  " , " [ " вводит поле индексов, "}" вводит условие if, " ] " эквивалентен кнопке "Add Line".

"Add Line" вводит вертикальную линию, определяющую блок операторов (аналогично "Begin ... End" в Паскале, "While ... Wend", "For ... Next" и др.). Это делает программу более читаемой.

Имена функций и операторов следует выбирать в соответствую-щем меню, либо пользоваться "горячими" клавишами. Это ничуть не умаляет самостоятельности пользователя, лишь гарантирует правиль-ность набра. Кроме того, введенная с помощью меню функция (или оператор) появляется на рабочем листе с точным указанием необходи-мого положения аргументов, что также уменьшает вероятность оши-бочного набора.

Клавиша "пробел" имеет специфическую функцию управления рабочим полем вводимого выражения (расширяет синий уголок, отме-

чающий "рабочую" часть выражения).

Всякая программа должна что-нибудь возвращать в качестве ре-зультата своей работы. Возвращаемое значение (или выжение) должно быть отдельно указано в конце программного блока. Если таких значе-ний несколько, то их следует организовать в виде вектора или матри-цы необходимых размеров (возвращаемый объект должен быть один).

Пример 1. Составим программу перевода чисел из десятичной системы счисления в систему с основанием q  (1,33], заменяя цифры после 9 буквами латинского алфавита. Сначала введем текстовый массив : i 0 . . 33 yi "0","1","2", (и т. д.),"z" . Далее, определим

функцию

Conv(x, q) e← 0.0000000001

m ← floor , t ← "" , r ← q m

while (r > e) (m > -15)

j ← floor , x ← x - j r , m ← m - 1

r ← , t ← concat( t, y j )

t ← concat (t, " . ") if m - 1

t

Здесь х - десятичное число, q - основание новой системы счисления. В программе для компактности в одной строке записано несколько опе-раторов присваивания (через запятую), что, в общем, не принято. Встроенная функция floor возвращает целую часть числа, функция concat(x, y) склеивает строки х и у. MathCad не имеет функции анало-гичной STRING$ в Бейсике, поэтому в приведенном виде функция правильно работает для x > 1.

Пример 2. Функция f(x) каждому x ≥ 0 ставит в соответствие n –ю цифру , где n = ([x] mod 4) + 2, [ ∙ ] – целая часть числа. Оп-

ределим функцию кодом:

f(x) := m 0 if x = 0

otherwise

n mod(floor(x), 4) + 2

r

n n – floor(log(r)) – 1

m mod(floor(r 10 n) , 10)

m

Теперь можно и график этой функции построить.

Пример 3. Покажем, что при циклической перестановке строк и столбцов квадратной матрицы ее определитель не меняется. Здесь бу-дут использованы некоторые встроенные функции раздела "Векторы и матрицы": функция Last( ) возвращает номер последнего элемента векторного аргумента, Submatrix(A, nr1, nr2, nc1, nc2) возвращает подматрицу матрицы А, расположенную на пересечении строк nr1…nr2 и столбцов nc1…nc2, Augment (A,B) объединяет матрицы, располагая их друг за другом (в порядке следования аргументов), Stack(A, B) объединяет матрицы, располагая их друг под другом (в порядке следования аргументов). Отметим еще, что верхний индекс в угловых скобках указывает номер столбца матрицы, а буква "Т" в качестве верхнего индекса указывает на транспонирование матрицы (столбцы матрицы записываются строками). Запишем функцию, кото-рая выполняет указанные циклические перестановки строк и столбцов матрицы:

Tran(A) := n Last (A)

B Submatrix(A, 0, n, 1, n)

B Augment(B, A)

C Submatrix(B, 1, n, 0, n)

C Stack

C

Тогда для произвольной квадратной матрицы А получим

|A| - |Tran(A)| = 0.

Mathcad допускает рекурсивное определение функций, если ре-курсия не слишком глубока.

Пример 4. Биномиальные коэффициенты

C = = (0! = 1 по определению) можно

определить следующей рекурсивной функцией

C(n, m) 1 if m 0

n if m 1

C(n - 1, m - 1) otherwise .

Пример 5. Функцию f(x) = можно определить рекурсивно с заданной точностью формулой f(x) = f  cos при |x| >  (если

при |x| ≤  считить f(x) = 1), например, так:

f(x) 1 if | x | < 0.0000001

f (0.5 x) cos(0.5 x) otherwise ,

(или проще: f(x) := if (|x| < 0.0000001, 1, f(0.5x)cos(0.5x))).

MathCad имеет возможность вычислять пределы символьно. Та-кая возможность реализуется лишь в весьма простых ситуациях. Чаще всего MathCad сообщает, что не может получить результат в аналити-

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

Пример 6. Пусть f0 (x) = и f n (x) = для n = 1,

2, … Вычислить f(x) = f n (x). Определим функцию кодом (вычи-

сления будут проводиться с точностью  = 0.0000001):

f(x) := e 0.0000001 , p , q -1

While |p – q| > e

q p, p

p

Функция определена, можно даже построить ее график.

MathCad имеет в составе меню средства для вычисления индек-сированных сумм и произведений с произвольным (но конечным) чи-слом элементов (некоторые частные случаи допускают аналитическое вычисление бесконечных сумм и произведений, но это скорее исклю-чения, чем правило). Там, где число слагаемых (сомножителей) неог-раничено, следует программировать вычисления с заданной погреш-ностью.

Пример 7. Выяснить поведение функции f(x) =

на промежутке . Представление функции в указанном виде не

воспринимается в MathCad, поэтому следует записать код:

f(x) := n 1, q 1, sum , p sum

While |q| > eps

n n + 1, p

q np, sum sum + q

sum

Наконец, MathCad имеет возможность непосредственного диф-ференцирования и интегрирования функций, причем вычисляются и частные производные функций многих переменных. Для функций

f : ℝ  ℝ и тем более для F: ℝ  ℝ эти операции не определены.

В таких случаях следует воспользоваться непосредственным прибли-женным вычислением производной как отношения изменения функ-ции к изменению аргумента. Для функции многих переменных произ-водная является вектором таких отношений, а для вектор-функции многих переменных это будет матрица (Якоби).

Пример 8. Пусть f : ℝ  ℝ. Вычисление производной функ-

ции f в конкретной точке х можно выполнить программой:

D(f, x) := e 0.0000001, d e -1, p f(x)

for j 0 .. Last(x)

y x, yj x j + e

S j (f(y) – p)d

S 'S – вектор.

Для функции F: ℝ  ℝ вычисление производной аналогично:

D(F, x) := e 0.0000001, d e -1, p F(x)

for j 0 .. Last(x)

y x, yj x j + e

S (F(y) – p)d

S 'S – матрица.

Все сказанное выше вовсе не уменьшает полезности пакета и для учебных целей, и для практических исследований. Тем не менее, гра-мотное использование MathCad как мощного вычислительного инст-румента маловероятно без попытки "заглянуть внутрь".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]