Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тарасевич Ю.Ю. - Численные методы на Mathcad

.pdf
Скачиваний:
108
Добавлен:
16.03.2015
Размер:
796.56 Кб
Скачать

 

 

 

Министерство образования РФ

 

Астраханский государственный педагогический университет

 

 

 

Ю. Ю. Тарасевич

 

 

Численные методы на Mathcad’е

 

1

 

 

 

 

 

 

0.5

 

 

 

 

 

f( z)

 

 

 

 

 

 

L( z)

0

 

 

 

 

 

 

 

 

 

 

 

yj

 

 

 

 

 

 

 

0.5

 

 

 

 

 

 

1

1

0.5

0

0.5

1

 

 

 

 

z, z, xj

 

 

 

 

 

Астрахань, 2000

 

 

ББК 22.19

Ю. Ю. Тарасевич Численные методы на Mathcad’е. – Астраханский гос. пед. ун-т: Астрахань, 2000.

ã Ю. Ю. Тарасевич, 2000

2

Введение

Сегодня не часто вспоминают о том, что компьютеры были созданы в первую очередь для проведения научных расчетов. До сих пор научные и инженерные расчеты остаются одной из важнейших, хотя, пожалуй, и не самой бросающейся в глаза сфер приложения компьютеров. За многие годы накоплены обширные библиотеки научных подпрограмм, в первую оче- редь, на языке FORTRAN, предназначенных для решения типовых задач (задачи линейной алгебры, интегрирование, решение дифференциальных уравнений и т. д.). Кроме того, имеется целый ряд различных математиче- ских пакетов, реализующих разнообразные численные методы, а так же способных производить аналитические математические преобразования. Пожалуй, наиболее известными сегодня являются следующие пакеты: Mathematica (фирма Wolfram Research), Maple (фирма Waterloo Maple Inc), Matlab (фирма The MathWorks), Mathcad (фирма MathSoft Inc). Первые два фактически являются языками для проведения символических математиче- ских преобразований.

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

Пакет Maple также весьма популярен в научных кругах. Кроме анали- тических преобразований пакет в состоянии решать задачи численно. Ха- рактерной особенностью пакета является то, что он позволяет конвертиро- вать документы в формат LaTeX – стандартный формат подавляющего большинства научных издательств мирового класса. Кроме того, ряд других

программных продуктов используют интегрированный символический процессор Maple. Например, пакет подготовки научных публикаций Scientific WorkPlace (фирма TCI Software Research) позволяет обращаться к сим-

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

Подобно упомянутым выше пакетам, пакет Matlab фактически пред- ставляет из себя своеобразный язык программирования высокого уровня, ориентированный на решение научных задач. Характерной особенностью пакета является то, что он позволяет сохранять документы в формате языка программирования С.

Пакет Mathcad популярен, пожалуй, более в инженерной, чем в научной среде. Характерной особенностью пакета является использование привыч- ных стандартных математических обозначений, то есть документ на экране выглядит точно так же обычный математический расчет. Для использова- ния пакета не требуется изучать какую-либо систему команд, как, напри- мер, в случае пакетов Mathematica или Maple. Пакет ориентирован в первую

3

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

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

иMaple имеют хорошие возможности для визуального программирования; в Matlab включена библиотека аналитических преобразований Maple; Mathcad позволяет работать совместно с Matlab.

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

Mathcad’у. Предполагается, что читатель имеет представление об основных численных методах и умеет пользоваться пакетом Mathcad хотя бы на са- мом примитивном уровне. Численные методы обсуждаются лишь в том объеме, который необходим для понимания работы соответствующих функций Mathcad′а. Необходимые ссылки как на учебники по численным методам, так и на руководства по пакету Mathcad читатель может найти в списке литературы. Отбор численных методов, включенных в пособие, с одной стороны отражает программу курса «Численные методы», а с другой стороны имеет в виду курс «Математическое моделирование и решение задач на ЭВМ», в котором многие из приведенных методов будут активно использоваться для решения задач компьютерного моделирования. Кроме того, к сожалению, существует настоящая пропасть между теми численны- ми методами, которые описаны в общедоступных учебниках, и теми, кото- рые применяются на практике. В замечательной, хотя и недоступной для большинства студентов книге "Numerical Recipes in C", авторы замечают: "Увы, времена меняются; <…> классические формулы почти абсолютно бесполезны. Они являются музейными экспонатами, хотя и прекрасными". В данном пособии делается попытка перебросить мостик через эту про- пасть.

На момент написания данного пособия последней версией Mathcad′а является версия Mathcad 2000 (предыдущая версия – Mathcad 8). Поскольку данная версия еще не получила повсеместного распространения, возможно- сти, реализованные только в этой версии, оговариваются в пособии особо.

4

Глава 1. Нахождение корней уравнений

Введение

Одним из наиболее распространенных методов поиска корней уравне- ний является метод Ньютона и его модификации. Пусть требуется решить

уравнение f (x) = 0 . Будем считать, что x является решением уравнения.

Разложим функцию f(x) в ряд в точке x0 близкой к точке x и ограничимся только первыми двумя членами разложения.

f (x) = f (x0 ) + f ′(x0 )(x x0 ) +K

Поскольку x корень уравнения, то f (x) = 0 . Следовательно,

x x0

f (x0 )

f ′(x0 )

 

 

Таким образом, если нам известно приближенное значение корня урав- нения, то полученное уравнение позволяет его уточнить. Понятно, что про- цесс уточнения можно повторять многократно, до тех пор, пока значение функции не будут отличаться от нуля на величину меньшую, чем заданная точность поиска. Очередное k-е приближение находится по формуле

xk +1

= xk

f (xk )

f ′(xk )

 

 

Ограничившись в разложении только первыми двумя членами, мы фак- тически заменили функцию f(x) на прямую линию, касательную в точке x0, поэтому метод Ньютона еще называют методом касательных. Далеко не

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

f ′(x) = lim

f (x +

x) − f (x)

f (x + x) − f (x)

 

 

 

 

 

 

 

 

x

 

 

x

→0

 

x

 

 

 

 

 

В качестве малой величины x можно взять, например, заданную точ-

ность вычислений ε , тогда расчетная формула примет вид

 

 

 

 

xk +1 = xk

 

f (xk

 

(1.1)

 

 

 

f (xk + ε ) − f (xk )

 

 

 

 

 

 

 

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

ся значениями функции, полученными на двух предыдущих шагах,

 

x

= x

 

f (xk )(xk xk )

=

f (xk )xk −1 f (xk −1 )xk

 

(1.2)

 

 

 

k +1

k

 

f (xk ) − f (xk −1 )

 

 

 

f (xk ) − f (xk −1 )

 

 

 

 

 

 

 

 

В таком виде метод называется методом секущих (secant method). При этом, однако, возникает проблема с вычислением первого приближения.

5

Обычно полагают, что x1 = x0 + ε , то есть первый шаг вычислений прово-

дится с использованием формулы (1.1), а все последующие с использова- нием формулы (1.2). Именно эта вычислительная схема реализована в паке- те Mathcad. Используя метод секущих, мы не можем гарантировать, что корень находится между двумя последними приближениями. Можно, одна- ко, для вычисления очередного приближения использовать границы интер- вала, на котором функция меняет знак. Такой метод называется методом хорд (false position method).

Идея метода секущих развивается в методе Мюллера. Однако в этом методе для нахождения очередного приближения используются три преды- дущие точки. Иными словами, метод использует не линейную, а квадратич- ную интерполяцию функции. Расчетные формулы метода следующие1:

q =

xk

- xk −1

 

 

 

 

 

 

 

 

 

 

 

 

- x

 

 

 

 

 

 

 

 

 

 

 

x

k −1

 

 

 

 

 

 

 

 

 

 

 

 

k −2

 

 

 

 

 

 

 

 

 

 

A = qf (xk ) - q(1+ q) f (xk −1 ) + q2 f (xk −2 )

 

 

(1.3)

B = (2q +1) f (x ) - (1+ q)2

f (x

) + q2 f (x

)

 

 

 

 

k

 

 

 

k −1

 

 

 

k −2

 

C = (1+ q) f (xk )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

æ

 

 

 

2C

ö

 

xk +1

= xk - (xk

- xk −1 )ç

 

 

 

 

 

 

 

÷

(1.4)

 

 

 

 

 

 

 

 

 

B

2

 

 

 

 

 

 

è B ±

 

 

- 4AC ø

 

Знак перед корнем выбирается так, чтобы абсолютное значение знаме- нателя было максимальным.

 

 

Поскольку

поиск корня

заканчивается, когда выполнится усло-

вие

 

f (xk +1 )

 

£ ε ,

то возможно

появление ложных корней. Например, для

 

 

уравнения x2 + 0.0001 = 0 ложный корень x = 0 появится в том случае, если точность поиска задана меньше, чем 0,0001. Увеличивая точность поиска, можно избавиться от ложных корней. Однако не для всех уравнений такой

подход работает. Например, для уравнения 1x = 0 , которое, очевидно, не

имеет действительных корней, для любой, сколь угодно малой точности найдется значение x, удовлетворяющее критерию окончания поиска. При- веденные примеры показывают, что к результатам компьютерных вычисле- ний всегда нужно относиться критически, анализировать их на правдопо- добность. Чтобы избежать "подводных камней" при использовании любого стандартного пакета, реализующего численные методы, нужно иметь хотя бы минимальное представление о том, какой именно численный метод реа- лизован для решения той или иной задачи.

1 Получите эти формулы самостоятельно по аналогии с методом Нью- тона, оставив в разложении Тейлора первые три слагаемых.

6

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

Вметоде Риддера (Ridder’s method) вычисляют значение функции в

середине интервала x3 = (x2 - x1 )

 

2 . Затем ищут экспоненциальную функ-

цию такую, что f (x ) - 2 f (x )eQ + f (x

2

)e2Q

= 0.

Затем применяют метод

1

3

 

 

 

 

 

 

 

 

 

хорд, используя значения

f (x ),

f (x )eQ , f (x

2

)e2Q

. Очередное значение вы-

числяют по формуле

1

 

3

 

 

 

 

 

 

 

 

 

sign ( f (x1 ) - f (x2 )) f (x3 )

 

x4 = x3 + (x3 - x1 )

(1.5)

 

 

 

 

 

 

 

 

 

f (x )2 - f (x ) f (x )

 

 

 

 

 

 

 

 

 

 

 

3

 

1

2

 

 

Метод Брента (Brent method) соединяет быстроту метода Риддера и гарантированную сходимость метода деления отрезка пополам. Метод ис- пользует обратную квадратичную интерполяцию, то есть ищет x как квад- ратичную функцию y. На каждом шаге проверяется локализация корня. Формулы метода достаточно громоздки и мы не будем их приводить.

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

Метод Лагерра (Laguerre’s method) основывается на следующих соот-

ношениях для полиномов

Pn (x) = (x - x1 )(x - x2 )K(x - xn )

ln Pn (x) = ln x - x1 + ln x - x2 Kln x - xn

d ln

 

Pn (x)

 

 

=

 

 

 

 

1

+

 

1

 

 

K

 

1

 

 

 

=

 

Pn¢

º G

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx

 

 

 

 

x - x

x - x

 

 

x

- x

 

 

P

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

d2 ln

 

P (x)

 

 

 

 

 

 

1

 

 

 

 

 

 

1

 

 

 

 

 

 

 

1

 

æ P¢ ö2

 

P¢¢

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

n

 

 

 

 

 

 

=

 

 

 

 

 

+

 

 

 

 

 

 

K

 

 

 

 

= ç

n

÷

-

n

º H

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx

2

 

 

 

 

 

 

 

(x

- x )

2

(x - x )

2

(x - x )

2

P

P

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

è

ø

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

2

 

 

 

 

 

 

n

 

n

 

n

 

Предполагают, что корень x1 находится на расстоянии a от текущего приближения, в то время как все другие корни находятся на расстоянии b: x - x1 = a; x - xi = b, если i = 2,3,K,n . Тогда

 

1

 

+

 

n -1

= G

 

 

a

 

 

 

 

 

 

 

 

b

,

 

 

 

1

 

 

 

 

n -1

 

 

 

 

+

 

= H

 

 

a2

b2

 

 

 

 

 

 

 

 

откуда

 

 

 

 

 

n

 

 

 

a =

 

 

 

 

 

 

 

 

 

 

.

G ±

 

 

 

 

 

 

 

 

 

 

 

 

(n -1)(nH - G2 )

7

Знак перед корнем выбирают с таким расчетом, чтобы получить наи-

большее значение знаменателя.

 

 

 

 

 

 

 

 

 

 

 

Еще один метод, который применяют для поиска корней полиномов, –

метод сопровождающей матрицы (companion matrix). Можно доказать,

что матрица

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

æ

 

an−1

 

an−2

 

a1

a0

ö

 

 

 

 

 

 

ç

-

a

n

-

a

n

L

- a

- a

n

÷

 

 

 

 

 

 

ç

 

 

 

 

L

n

 

÷

 

 

 

 

 

 

ç

 

1

 

 

0

 

0

0

 

÷

 

 

 

 

 

A = ç

 

0

 

 

1

 

L

0

0

 

÷ ,

 

 

 

 

 

 

ç

 

 

 

 

 

÷

 

 

 

 

 

 

ç

 

M

 

 

 

 

 

 

M

 

÷

 

 

 

 

 

 

ç

 

 

 

 

 

 

 

 

÷

 

 

 

 

 

 

ç

 

0

 

 

0

 

L

1

0

 

÷

 

 

 

 

 

 

è

 

 

 

 

 

ø

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

называемая сопровождающей матрицей для полинома P(x) = åai xi , имеет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i =0

 

собственные значения равные корням полинома. Напомним, что собствен-

ными значениями матрицы называются такие числа λ, для которых выпол-

няется равенство

Ax = λx или

P(x) = det(A - λI) = 0 . Существуют весьма

эффективные методы поиска собственных значений, о некоторых из них мы

будем говорить далее. Таким образом, задачу поиска корней полинома

можно свести к задаче поиска собственных значений сопровождающей

матрицы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1. Функции произвольного вида

 

 

 

 

 

 

Найдем нули функции

 

 

f(x)

cos( x)

на

 

интервале

x=[–2,7],

 

 

(x

5)2

 

используя Mathcad

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Изобразим сначала функцию на графике.

 

 

 

 

 

 

x

2, 1.95.. 7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.05

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f( x)

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.05

2

1

 

0

1

 

2

3

4

5

 

6

7

8

 

 

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

На заданном интервале функция три раза обращается в ноль. Опреде-

лим нули функции, используя встроенную функцию root(f(x),x). Первый

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

аргумент функция, нуль которой необходимо найти, второй переменная, которую необходимо варьировать. (Вообще говоря, функция f может быть функцией многих переменных и необходимо указывать, по какой именно переменной мы ищем нуль функции.) Кроме того, необходимо задать на- чальное приближение поиска. Точность вычислений задается встроенной переменной TOL. По умолчанию ее значение равно 0,001. Это значение можно изменить либо через меню Math/Built–In Variables или непосредст-

венно в тексте документа: TOL

 

10 9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задаем начальное приближение: x

 

 

1

 

 

 

 

И вычисляем корень: root( f( x), x) =

 

 

1.570796327

 

 

Если требуется найти несколько корней, как в нашей задаче, то имеет

смысл определить новую функцию: r(x)

 

 

 

root(f( x) , x)

 

 

 

 

 

 

Функция r(x) возвращает значение корня ближайшее к x2, то есть на- чальное приближение мы задаем через аргумент функции. Задаем вектор начальных приближений x и находим соответствующие им корни X:

i

 

0.. 2

xi

 

Xi

 

r xi

Xi

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

1.570796327

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

1.570796327

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

4.712388981

 

 

 

 

 

 

 

 

 

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

Они равны на заданном интервале −π/2, π/2 и 3π/2. Полученный численный результат с заданной точностью совпадает с точным решением.

Определение новой функции целесообразно и в том случае, когда мы хотим исследовать зависимость решения от параметра. Пусть функция за- висит от параметра a

z( a, x)

 

root

cos ( a.x)

, x

 

( x

 

 

 

5)2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Первый аргумент функции z задает значение параметра, второй на- чальное приближение. Найдем корни уравнения при значениях параметра 1

и 2.

z( 1, 1) = 1.571

z( 2, 1) = 0.785

Если мы хотим получить комплексный корень, то начальное приближе- ние следует задавать комплексным:

2 К сожалению, это не всегда так. Если начальное приближение выбрано неудачно и зна- чение производной в этой точке близко к нулю, то, вообще говоря, найденный корень может быть не ближайшим к начальному приближению. В качестве примера решите самостоятельно

задачу поиска корня уравнения sin(x) = 0 , выбрав в качестве начального приближения чис-

ло близкое к π2 . Чем ближе к π2 будет выбранное значение, тем более далекий от 0 корень мы будем получать.

9

z( i ,i ) = 7.459 10 9 +1.571i

1.2. Нахождение корней полиномов

Для нахождения корней полиномов имеется встроенная функция polyroots(a). Аргументом функции является вектор коэффициентов полино-

ма a0 + a1 x + a2 x2 +K+ an xn , то есть для уравнения 3x2 + 2x +1 = 0 вектор а

имеет вид

 

 

 

 

 

ai

 

 

 

 

 

 

0.333

 

0.471i

i

 

 

0.. 2

 

 

 

 

polyroots (a) =

 

 

 

 

 

 

 

 

 

0.333 + 0.471i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если в полиноме отсутствуют некоторые степени, то на соответствую-

щих

местах

следует

писать 0. Пусть

требуется найти корни полинома

p(x) = x3 + 2x2 −1

 

 

 

 

 

 

 

 

 

 

 

 

ai

 

 

 

 

 

 

1.618

 

 

 

 

 

 

 

 

 

 

i

 

 

0.. 3

 

 

 

polyroots ( a ) =

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

0.618

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Коэффициенты полинома могут быть и комплексными.

1.3. Нахождение корней уравнений путем символических преобразований.

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

пункт Solve for Variable

cos (a.x)

решение готово ––>

1

.

π

(x

 

 

 

5)

2

2

a

 

 

 

 

 

Обратите внимание! В данном случае был найден только один ко- рень, хотя, очевидно, их бесконечно много.

В случае полинома Mathcad, а точнее встроенный символический

10