Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Берков_Н.Практикум_Mathcad.pdf
Скачиваний:
111
Добавлен:
26.05.2015
Размер:
1.2 Mб
Скачать

7.Программирование в Mathcad

Впакете Mathcad существует богатый набор средств для решения различных математических задач, встроено огромное количество функций из различных разделов математики. Однако написать функции для всех практических задач, которые могут стоять перед пользователями пакета, невозможно. Для расширения возможностей разработчики пакета встроили достаточно простой и оригинальный язык программирования. В любом месте документа Mathcad можно вставить код программы на встроенном языке программирования. Это можно сделать при помощи «горячих клавиш» или команд из панели инструментов Programming (Программирование).

Для визуализации панели програм-

мирования необходимо нажать на кнопку из панели математических инструментов или по-

дать команду View \Toolbars \Programming. На данной панели имеется десять команд. Щелчок по одной из этих команд создает в текущей

позиции заготовку для соответствующей программной конструкции. При частом использовании команд программирования удобнее запомнить комбинации «горячих клавиш» и команды генерировать при помощи клавиатуры.

Примечание. При составлении программ ключевые слова команд вручную писать нельзя. Заготовку команды можно получить только при помощи щелчка мыши по соответствующей кнопке или при помощи комбинаций клавиш.

Приведем значение «горячих клавиш», использующих при программировании на Mathcadе.

Команда

Горячая клавиша

Команда

Горячая клавиша

Add Line

]

{

if

}

otherwise

CTR+Shift+]

for

Ctrl+Shift+’

while

Ctrl+]

break

Ctrl+Shift+[

continue

Ctrl+[

return

Ctrl+Shift+\

On error

Ctrl+’

Предполагается, что читатель уже знаком с основными идеями программирования, изучив один из стандартных языков про-

118

граммирования: QBasic, Visual Basic, Fortran, Pascal, C++, Java, Ruby или любой другой язык программирования. Данный практикум адресован пользователям, решающим инженерные и научные задачи, для которых программирование не является основным видом деятельности. Для таких пользователей языки программирования C++ и Java противопоказаны, так как ориентированы на профессиональных специалистов. Инженерам, использующим программирование не ежедневно, для решения большинства задач достаточно и одиннадцати команд из панели программирования Mathcad.

Сразу же отметим недостатки программирования в среде Mathcad. Одним из главных недостатков является неразвитость отладчика программ. Ошибки, возникающие при выполнении программ, отображаются, но подробной информации о типе ошибки, значении локальных и глобальных переменных в момент останова программы оперативно получить нельзя. Отлаживать программы уже средней сложности в Mathcad не доставляет особой радости. Поэтому сложные инженерные, научные и экономические задачи удобнее и быстрее, с точки зрения автора, выполнять в рамках визуального алгоритмического языка Visual Basic [3] или последних версий языка Fortran.

Рассмотрим все команды из панели программирования Math-

cad.

1. Add Line – добавить строку в текущую позицию программы. При вводе данной команды появляется или расширяется на одну строку вертикальная линия, объединяющая отдельные операторы в блок с одним входом и одним выходом, который выполняется как один оператор.

Позиция, куда вставится строка, определяется положением курсора. Чтоб вставить новую строку в середину программы, нужно выделить (пробелами) строку перед позицией, куда будет вставлена пустая строка. Удалить лишнюю строку можно с помощью кнопки backspace на клавиатуре.

Для того чтобы начать ввод подпрограммы, необходимо набрать имя программы и в скобках через запятую перечислить формальные параметры подпрограммы, ввести нужное количество раз команду Add Line. Программа выводит последнюю переменную, обрабатываемую программой перед выходом. Вместо

119

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

2. – оператор присваивания значения локальной переменной. При выходе из блока программы значения локальных переменных оказываются недоступны для других участков Mathcad файла.

В Mathcad имеются два оператора присваивания: для глобальных переменных (обозначается двумя символами «:=») и для локальных переменных «». Глобальные переменные доступны в любом месте программы после объявления данной переменной, а локальные – только в текущем блоке.

Для пояснения действия локального и глобального оператора присваивания рассмотрим пример простейшей программы на

Mathcad.

Напишем программу для решения квадратного уравнения ax2+bx+c=0. В программе при помощи операторов глобального присваивания задаются значения глобальных переменных a, b и c. Для сравнения введем еще локальную переменную k и присвоим ей значение 4. Далее вычисляем значение корней квадратного уравнения при помощи программы, состоящей из одного блока операторов. В программе применяются три оператора локального присваивания и возвращается значения вектора x, состоящего из двух чисел. После выполнения программы выводим значение всех переменных, используемых в программе. При этом значение всех локальных переменных D, x и k, заданных вне блока, программа не видит, поэтому вместо знака = выводится оператор глобального присваивания «:=». В этом случае значение переменной не выводится, а вместо него отображается красный прямоугольный маркер.

120

Начало программы.

a :=1 b := −4 c := 3 k 4 ORIGIN :=1

x1

 

=

D

b2 4 a c

 

 

 

 

 

 

 

 

 

x2

 

 

x

b

D

 

 

 

 

 

 

 

 

 

 

 

1

 

 

2 a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

b +

D

 

 

 

 

 

 

 

 

 

 

2

 

 

2 a

 

 

 

 

 

 

x

 

 

 

 

 

D :=

x :=

k :=

 

 

 

 

 

 

 

x1 =1 x2 = 3 a =1 b = −4 c = 3.

Конец программы.

3. Оператор if предназначен для организации разветвляющихся вычислительных процессов. Чтобы ввести оператор if в программу, необходимо мышкой щелкнуть по кнопке if из панели программирования или использовать горячую клавишу – }.

При этом в программу вставляется заготовка для оператора if: if .

Общий вид простого оператора if: D if L, L – логическое выражение;

D – оператор, выполняемый в случае, если условие L принимает значение «истина».

Оператор работает следующим образом:

вычисляется логическое условие L;

если L – истина, то выполняется оператор D, в ином случае он не выполняется;

выполнение программы продолжается со следующего,

после if, оператора.

Как мы видим, данный оператор if идентичен аналогичному оператору из других высокоуровневых языков программирования. Единственное отличие заключаются в синтаксисе.

Для формирования сложных условий можно использовать панель инструментов Boolean, содержатся знаки логического равенства, неравенства и логических операций. В частности, «V» означает логическое «или», а «Λ» — логическое «и».

121

Таким образом, чтобы сформулировать условие, что переменная х находится в диапазоне (–3;4), необходимо написать: x > –3 Λ x < 4.

При формулировании сложных логических условий для расстановки приоритетов можно использовать скобки.

Пример. Построить график следующей функции:

28 6x,

x (−∞;3)

 

+1,

x [3;1] .

f (x) = x2

 

 

x (1,)

2,

 

Решение.

f (x) := 28 6 x if x > 3

x2 +1 if x 3 x ≥ −1

2if x < −1

Всложных подпрограммах

часто используется блочный оператор if: if L

D1

Dn

Где D1, …, Dn – действия, выполняемые в случае, если логическое условие L истинно.

Для того чтобы вставить подобную конструкцию, нам необходимо, на панели инструментов Programming, выбрать if , затем установить курсор на место ввода слева от оператора if и n раз нажать на Add Line.

Приведем пример программы с подобным оператором. Усовершенствуем программу для решения квадратного уравнения ax2+bx+c=0.

122

Начало программы.

x1

 

=

ORIGIN :=1 a :=1 b := −1 c := 4

 

 

D b

2

4

a c

x2

 

 

 

 

 

 

if D 0

 

x1 b2a D x2 b2+ a D

if D < 0

x1 "действительных корней нет" x2 "действительных корней нет"

x

x1 ="действительных корней нет" x2 ="действительных корней нет"

Конец программы.

В данном случае при дискриминанте меньше 0 программа выдает сообщение «действительных корней нет!».

Кроме оператора if, программа Mathcad может содержать и оператор otherwise.

4. Оператор otherwise применяется в случае, когда используется условие с двумя вариантами действия, то есть, если условие истинно, нужно выполнить одно действие (или действия), а если ложно, то другое.

Общий вид такого оператора следующий:

D1 if L

D2 otherwise

В случае если условие L истинно, выполняются действия D1, иначе выполняются действия D2. То есть otherwise аналогичен оператору else в Бейсике, Фортране и других высокоуровневых языках.

Рассмотрим пример программы, использующей операторы if и otherwise. В данном случае проверяются условия, при которых логарифм не существует (x<0 или y<0 или y=1). Если они выпол-

123

нены, выдается сообщение «error», в противном случае вычисля-

ется logyx.

 

 

 

f _ log(x, y) :=

 

"error"

if x 0 y 0 y =1

 

 

 

log(x, y)

otherwise

f _ log(4,5) ="error"

 

f _ log(8,2) = 3

 

 

 

Когда в блоке otherwise несколько строк, нужно установить курсор в место ввода слева от оператора otherwise и нажать Add Line необходимое количество раз.

Вернемся к программе, вычисляющей корни уравнения ax2+bx+c=0, и запишем ее с помощью операторов if и otherwise. Начало программы.

ORIGIN :=1 a :=1 b := 2 c := 2

x1

=

 

D b

2

4 a c

 

 

 

 

 

 

 

 

 

 

 

 

x2

 

 

if D 0

 

 

 

 

 

 

 

x

 

b

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

2 a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

b +

D

 

 

 

 

 

 

 

 

 

 

2

 

 

 

2 a

 

 

 

 

 

 

otherwise

 

 

 

 

 

 

 

x1 "действительных корней нет"

 

 

 

 

 

 

 

 

x2 "действительных корней нет"

 

 

 

x

 

 

 

 

 

 

 

x1 = −2

 

x2 = −1

 

 

 

Конец программы.

5. Оператор for используется для создания циклических вычислительных процессов. В документе Mathcad простейшие циклы могут быть заменены ранжированными векторами. Для более сложных циклов необходимо составлять программу.

Чтобы вставить оператор for в программу, необходимо мышкой щелкнуть по кнопке for из панели программирования или использовать «горячую» клавишу «Ctrl+Shift+’». При этом в программу вставляется заготовка для оператора for:

124

for

Общий вид оператора выбора for: for i k1..kn

D

Или

for i (k1 k2 k3 ... kn)

D

Где i – счетчик цикла. Переменная, которая меняется в диапазоне от k1 до kn. Диапазон изменения счетчика цикла вводится с помощью ранжированной переменной или с помощью вектора.

D –действия, которые выполняются в цикле (тело цикла). Ниже приведен пример, в котором диапазон изменения счетчика цикла n задан с помощью вектора. Вектор вставляется с по-

мощью панели инструментов Matrix.

sum := s 0

for n (1 2 5 7 10 11 13 16 17 19)

s s + 1n

sum = 2.285.

Данная программа вычисляет сумму

Sum=1+1/2+1/5+1/7+1/10+1/11+1/13+1/16+1/17+1/19.

Если тело цикла оператора for состоит из нескольких строк, то необходимо установить курсор на позицию для ввода тела цикла и соответствующее количество раз нажать на Add Line.

Как и в обычных программах, циклы и условные операторы могут быть вложенными. Mathcad, впрочем, сам следит за вложенностью циклов и сделать ошибку во вложенности просто не позволит.

Пример. Написать функцию FA, создающую матрицу A, состоящую из M строк и N столбцов следующего вида:

125

1

2

4

8

16

 

 

0

1

2

4

8

 

 

 

 

0

0

1

2

4

 

 

 

 

0

0

0

1

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запишем подпрограмму, выводящую эту матрицу с помощью двух вложенных циклов:

FA(M , N ) :=

 

for

i 0..M 1

 

 

 

 

 

 

 

for

j 0..N 1

 

 

 

 

 

 

Ai , j

1

if

i = j

 

 

 

 

 

 

 

 

 

 

Ai , j

0

if

i > j

 

 

 

 

 

Ai , j 2 Ai, j1

if i < j

 

 

 

A

 

 

 

 

 

1

2

4

8

16

 

 

 

0

1

2

4

8

 

 

 

FA(4,5) =

 

 

 

 

0

0

1

2

4

 

 

 

 

 

 

 

 

0

0

0

1

2

 

 

 

Обозначим i

строку матрицы, j – столбец матрицы.

Тогда главная диагональ задается уравнением «i=j», элементы матрицы, расположенные выше главной диагонали, уравнением «i<j», а элементы матрицы, расположенные ниже главной диагонали, – усравнением «i<j».

Каждый элемент, расположенный выше главной диагонали, вычисляется как удвоенное произведение элемента, стоящего в этой же строке в предыдущем столбце: Ai j=2* Ai j–1.

Для проверки работы функции подали команду: FA(4,5)=. 6. Оператор цикла while используется тогда, когда цикл дол-

жен выполняться не заданное количество раз, а до тех пор, пока не будет выполнено определенное в цикле условие.

Чтобы вставить оператор while в программу, необходимо мышкой щелкнуть по кнопке while из панели программирования или использовать горячую клавишу – «Ctrl+]». При этом в программу вставляется заготовка для оператора while:

126

while

Общий вид оператора While: while L

D,

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

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

Следует заметить, что если условие L истинно всегда, то программа будет работать бесконечно (зациклится). Именно поэтому с циклом while необходимо быть очень осторожным и тщательно проверять условие выхода из цикла, прежде чем выполнять программу.

Если программа все-таки повисла, то чтобы прервать ее выполнение, необходимо нажать клавишу «Esc» и в появившемся окне нажать на кнопку OK.

Приведем пример программы, использующей цикл while.

sum(tol) :=

sum(0.1)

s 0

 

 

 

n 1

 

 

 

 

1

 

 

while

 

 

> tol

n

 

 

 

 

s s + 1n n n +1

s

= 2.829.

127

Вданной программе с указанной точностью (tol) вычисляется сумма s=1+1/2+1/3+1/4+1/5+1/6+1/7…

7. Оператор break обеспечивает экстренный выход из цикла. Программа при этом продолжает выполнять следующую после цикла строку. Данный оператор часто применяется, чтобы избежать «зацикливания» программы.

Вкачестве примера применения оператора break рассмотрим

 

12n 1

 

 

 

задачу вычисления суммы числового ряда S =

 

 

.

В

n

3

n=1

+ 2n +1

 

 

приведенной ниже программе, суммирование членов ряда прекращается, когда достигается точность, указанная параметром tol или если число итераций цикла превышает 10000.

f (n) :=

12 n 1

 

n3 + 2 n +1

 

sum(tol) := s 0 n 1

while f (n) > tol s s + f (n)

break if n >10000 n n +1

s sum(0.000011) =8.726 .

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

8. Оператор continue возвращает управление в первую строку цикла. Как только этот оператор встречается в программе, выполнение текущей итерации прерывается и выполняется переход на следующую итерацию цикла. Выход из цикла не производится.

Данный оператор, как и оператор break, не содержит параметров.

128

Пример: Найти сумму N первых членов ряда:

N

 

1

 

S =

 

.

2n

3

n=1

16

 

В программе, при помощи оператора continue, происходит обход слагаемого в котором знаменатель дроби равен нулю.

sum(N ) :=

 

s 0

 

 

 

for n 1..N

 

 

 

a 2 n3 16

 

 

 

 

 

 

continue if a = 0

 

 

 

s s + 1

 

 

 

a

 

 

s

sum(100) = −0.024.

9. Оператор return прерывает выполнение программы. В качестве результата работы программы возвращается значение, указанное в позиции для ввода, после оператора return.

При выборе на панели инструментов пункта return вставляется строка.

Пример. Подсчитать с указанной точностью tol сумму ряда:

 

 

12n

 

S =

 

 

.

n

2

+ 2n +16

n=1

 

 

Если ряд получается расходящийся, программа выдаст сообщение «расходится». Ряд будет считаться расходящимся, если число итераций цикла превысило 1000000 раз.

f 1(n) :=

12n

n2 + 2n +16

 

 

 

 

 

sum1(N ) :=

 

s 0

 

 

 

n 1

 

 

while

 

f 1(n)

 

> tol

 

 

 

 

 

 

 

s s + f 1(n)

 

 

 

 

 

 

return " ряд расходится" if n >100000

 

 

 

n n +1

 

 

s

129

sum1(0.01) =" ряд расходится".

10. Оператор on error отвечает за обработку ошибок. При выборе данного оператора в программу вставляется заготовка следующего вида:

Общий вид оператора on error: D1 on error D2 .

Если при вычислении выражения D1 произошла ошибка, будет вычислено значение D2.

Данный оператор имеет смысл использовать, если при выполнении программы возможна ошибка в каком-то определенном месте, например деление на ноль.

Приведем пример программы, вычисляющей десятичный логарифм числа xy.

Если логарифм не существует, выдается сообщение об ошибке: «аргумент логарифма <0».

 

 

 

f (x, y) :=

 

z x y

 

 

 

"аргумент логарифма < 0" on error log(z)

f (0,5) ="аргумент логарифма < 0";

f (10,1) =1.

Оператор on error можно применять в комплексе встроенной функцией error().

f (x, y) := z x y

error("аргумент логарифма < 0") on error log(z)

В данном случае сообщение об ошибке будет показываться в стандартном для Mathcad виде. При ошибке текст вызова функции выделяется красным цветом, а при подведении мыши к этому вызову внизу отображается запрограммированный в функции error текст.

130