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

Информатика

.pdf
Скачиваний:
24
Добавлен:
03.05.2015
Размер:
3.59 Mб
Скачать

151

n

( k). Чаще рассматривают функцию φ(β) = ∑k=0(f(β, k) - yk)2 и приравнивают ее к нулю в блоке given - minerr. Рассмотрим

Пример 17. Значения некоторой величины, измеренные через равные проме-

жутки времени, имеют вид y := (72 70 62 52 100 92 80 60 90 80 68 50 64 58 48 30)T. Данные носят колебательный характер. Выясним общую тенденцию изменения данных, подобрав параболу f(a, b, c, t) := a + b∙t + c∙t2, наиболее подходящую в смысле МНК: положим n := 15, i := 0..n, определим a := 0, b := 0, c := 0 и введем блок

Given

 

 

 

 

 

 

 

 

a

 

a

63.559

∑(f(a,b,c,i) - yi)

2

 

:= Minerr(a,b,c)

 

 

 

= 0

b

b

= 5.789

.

i

 

c

 

c

-0.513

 

Получим коэффициенты наилучшей параболы. Вычтем ее из исходных данных, полагая zi := (c∙i + b)∙i +a, ri := yi - zi. В результате останется чисто колебательный процесс с переменной амплитудой. Попробуем этот процесс представить функ-

цией φ(A, s, ω, τ, t) =A∙es∙t∙sin(ω∙t + τ). Возьмем для начала A:= 10, s := -0.5, ω :=

1.5, τ := 1 и введем блок

Given

 

A

∑(φ(A,s,ω,τ,i) - ri)2 = 0 s

:= Minerr

 

ω

 

i

τ

 

 

Используя полученные данные, построим окончательную модель y(t) = a + bt + ct2 +

+Aestsin(ωt + τ). Вычислим значения gi := (c∙i + b)∙i + a + A∙est∙sin(ω∙t + τ) и сравним на

графике значения yi, zi, gi (см. рис. 64).

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

Работа с файлами

A 18.252

s -0.043ωτ = 2.161.5 .

Рис. 64

Текстовые файлы (файлы данных)

Функции (записываются через знак присваивания, расширение файла

"prn"):

readprn("путь к файлу") – чтение данных в матрицу из текстового файла,

writeprn("путь к файлу") – запись данных в текстовый файл, appendprn("путь к файлу") – дополнение текстового файла.

152

 

 

 

 

1

3

-5

0

 

Пример 18. Запишем в текущий каталог матрицу С = 9

4

2

2

командой

6

-1

4

0

 

3

3

-7

1

writeprn("data.prn"):= C, прочитаем D:= readprn("data.prn"), добавим в файл матрицы строку k := (3 7 2 1) командой appendprn("data.prn"):= k.

Графические файлы

readrgb("путь к файлу") – чтение цветного изображения, readbmp("путь к файлу") – чтение изображения в оттенках серого.

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

Пример 19. Файл "Ecoinfo.bmp", находящийся в папке "Temp" диска F, содержит текстовую информацию в графическом виде. Часть этого файла представлена рисунком 65 (слева). Прочитаем содержимое файла в массив А командой A := READBMP ("F:\Temp\Ecoinfo.bmp"). Элементы матрицы суть натуральные числа из [0, 255] (0 соответствует черному цвету, 255 белому). Попрбуем сделать изобра-

жение более четким. Положим i:= 0 .. rows(A)-1, j:= 0 .. cols(A)-1, и Bi, j := if(Ai, j < 140, 0, 255). Ниже на рис. 65 приведено исходное изображение (слева) и исправленное (справа), соответствующее в результате такой "фильтрации" матрице В.

Рис. 65

Звуковые файлы (с расширением "wav")

readwav("путь к файлу") – чтение звукового файла в матрицу, writewav("путь к файлу",s,b) – запись в звуковой файл (s – скорость

сэмплов, b – разрешение звука в битах),

getwavinfo("путь к файлу") – создает вектор с информацией о звуковом файле.

В поздних версиях Mcd (13 и далее) имеется встроенный "мастер импорта данных", помогающий в работе с файлами.

153

Программная среда Mсd дает возможность пользователю работать в трех основных режимах:

1.В режиме непосредственного вычисления.

2.В режиме аналитических преобразований.

3.В режиме численного моделирования и программирования.

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

Пример 20. Для функции f(x) = (x0 - 2)4 +∑3k=1(xk - x 2k-1)2 при начальном значении xk = k, k = 0, ..., 3, попытка найти минимум (очевидно, равный нулю при х = (2,

4, 16, 256)Т) с помощью встроенной функции minimize приводит к результату х = minimize(f,x) = (1.409 1.844 3.362 11.296)T – ничего похожего. Воспользуемся тео-

ремой Ферма и попробуем при тех же условиях найти решение уравнения f '(x) = 0, используя оператор градиента х и блок поска решений Given – Find. Проблема с поиском – решение не найдено. Вычислим, наконец, производную (градиент) непосредственно, вернее, приближенно, кодом:

Df(x) : = ε ← 0.0000001, p ← f(x)

for i 0 .. last(x)

y ← x, yi ← xi + ε di ← (f(y) - p) −: ε

d

Теперь блок Given Df(x) = 0 Find(x)T= (1.918 3.679 13.534 183.172) возвращает результат, намного более точный. Вычисление второй производной (т.е. матрицы Гессе в данном случае) аналитически затруднительно. Но легко воспользоваться приведенным выше кодом, слегка изменив его:

D2f(x) : = ε ← 0.0000001, p ← Df(x)

for i 0 .. last(x)

y ← x, yi ← xi + ε di← (Df(y) – p) −: ε

d

Если теперь в найденой точке экстремума вычислить A:= D2f(x) и, полагая k:=0..4, вычислить все главные определители матрицы А, получим:

|submatrix(A,0,k,0,k)| = 29.515

3.196∙103

4.618∙106

1.863

154

т.е. все эти определители положительны, по критерию Сильвестра матрица А положительно определена, следовательно, найденная точка – точка минимума.

Здесь снова в целях компактности записи нарушается правило для операторов в Mcd: каждый оператор должен быть записан в отдельной строке (запятые для разделения операторов недопустимы!). В качестве знака деления (с той же целью) использован (допустимый!) символ ": ", верхний индекс в угловых скобках обозначает столбец матрицы, функция last() возвращает индекс последнего элемента аргумента, функция submatrix(A,i,j,p,q) возвращает подматрицу матрицы А с элементами Au,v, i ≤ u ≤ j, p ≤ v ≤ q, вертикальные скобки возвращают модуль числа, длину вектора или определитель матрицы.

Пример 21. Бесконечные суммы и произведения, в общем, аналитически не вычисляются, несмотря на наличие в Mcd соответствующих операторов. В таких ситуациях требуется программирование (см. примеры 11-13 п. 1.6 и примеры следующих разделов).

6.2. НЕКОТОРЫЕ ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИ

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

1)на конкретных примерах научиться программированию;

2)заглянуть в "кухню" алгоритмов, используемых в пакете Mcd, чтобы пользоваться ими сознательно.

6.2.1.Системы уравнений

В общем, в простейшей ситуации здесь можно воспользоваться кнопкой "Solve", блоками Given ... Find, Given ... Minerr, а также функциями Root, Polyroot (для многочленов), Lsolve (для линейных систем уравнений), обратной матрицей, обобщенной обратной матрицей (Geninv), а в случае двух переменных функциями Slope, Intercept.

6.2.1.1.Системы линейных уравнений

Вэтом пункте будет обсуждаться задача решения системы линейных уравнений вида Ax = b, где А – прямоугольная (чаще всего квадратная) матрица, х – искомый вектор, b – вектор (или матрица) правой части. Если А – квадратная невырожденная матрица, а b – вектор,

то задача легко решается либо использованием обратной матрицы (x = A-1b), либо применением встроенной функции lsolve(A, b), возвращающей вектор решения. В противном случае следует использовать специальные методы, выбирающие решение специальным образом.

155

А. Обыкновенная квадратная хорошо обусловленная (определитель матрицы А не слишком мал по сравнению с ее элементами) система уравнений. Ее можно легко решить методом Крамера и методом исключения Гаусса. Программирование метода Крамера довольно очевидно:

Cramer(A, b) := d |A| - 1

for k 0 .. last(b)

‹ k ›

C A, C b

x k |C| ∙ d

x

Приведем также простейший вариант метода Гаусса с выбором диагональных элементов (который используется крайне редко):

Gauss(A,b) : = A ← augment(A,b)T, n ← last(b)

for i 0 .. n

A‹i›← (Ai,i)-1∙A‹i›

for j 0 .. n

A‹j›← A‹j› - Ai,j ∙A‹i› if i j submatrix(A,n+1,n+1,0,n)T

(сравните с текстом кода в п. 1.7.3 с выбором максимального элемента).

Пример 1. Проверьте, что исключения Гаусса по диагонали не ра-

1 2 3

ботают для системы уравнений с матрицей A= 1 2 4 , det(A) = 5.

4 3 2

Б. Переопределенные системы линейных уравнений полного ранга (ранг матрицы системы равен размерности пространства аргументов) легко решаются методом псевдообратной матрицы (вариант метода наименьших квадратов) с помощью встроенной функции geninv(). В старших версиях Mcd этот метод включен в функцию lsolve, возвращающую как решение, так и псевдорешение системы линейных уравнениы (см. п. 6.1, Векторы, матрицы, СЛАУ).

Если система неполного ранга, решение (или псевдорешение) следует выбирать , исходя из каких-то дополнительных условий. Часто это - требование минимальной нормы решения (близость к началу координат). В этом случае в основу поиска решения кладется комбинация метода исключения Гаусса с выбором главного элемента (см. п. 1.7.3) и метода псевдообратной матрицы: сначала выбирается подсистема полного ранга, далее, если ее ранг равен рангу исходной системы, то находится решение методом исключения, иначе если подсистема переопределена, то находится псевдорешение (geninv), в противном случае – решение с минимальной нормой (см. п. 6.1, СЛАУ).

 

 

 

 

156

 

 

Пример 2. Для системы уравнений Aх = b с прямоугольной мат-

1 5

 

 

 

1

 

 

2 4

 

 

 

3

 

 

рицей A = 3 3

 

и правой

частью b = 2

 

функция lsolve(A,b) воз-

4 2

 

 

 

-2

 

 

 

-0.2

. Но с транспонированной матрицей А

вращает псевдорешение

 

 

 

0.5

 

 

 

 

1 2 3 4

 

и правой

3

lsolve(A,b) уже не справляется.

=

5 4 3 2

 

частью b =

 

 

 

1

 

Минимальное по (евклидовой) норме решение можно получить, вычи-

-0.233

слив (вручную) псевдообратную матрицу: AT∙(A∙AT)-1∙b = 0.033 .

0.30.567

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

Пример 3. Рассмотрим систему линейных уравнений A x=b с

доминирующей главной диагональю,

т. е. с матрицей А такой, что

 

 

0 при i = j

 

|Ai, i | > |A i, j|. Введем матрицу Т i, j =

 

и вектор s i = b i /

 

A i, j / A i, i , i j

i j

 

 

 

A i,i. Тогда систему уравнений можно записать в виде x = s - T x .

Введем в пространстве аргумнтов норму ||x|| = max |xk|. Согласованная

k

с ней норма матрицы имеет вид: ||A|| = max ∑ |Ak,j|. Легко проверить,

k j

что в данном случае ||T|| ≤ δ < 1, так что итерационный процесс уточнения решения x (n + 1) = s - T x (n), x (0) = s, n = 0, 1, ... , будет сходиться к точному решению исходной задачи (метод простых итераций). Действительно, если рассмотреть соответствующую последователь-

ность отклонений ε(k) = x(k+1) – x(k) ( k), то она получается вследствии

итерационного поцесса: ε(n+1) = T∙ε(n) ( n). Переходя к нормам, отсюда

имеем: ||ε(n+1)|| ≤ ||T||∙||ε(n)|| ≤ δ||ε(n)|| ≤ δn||ε(1)|| → 0 (т.е. отклонения

(n→∞)

убывают со скоростью геометрической прогрессии, итерации быстро сходятся к точному решению). На каждой итерации требуется лишь порядка n2 вычислений, так что процесс достаточно экономный. Итерации можно оформить в виде функции:

157

ITER(A, b, e) := n last (b)

for i 0 . . n

r (A i, i ) -1, x i b i ∙ r s i x i , y i 0

for j 0 . . n

T i, j if (i = j, 0, A i, j ∙ r) while |x - y| > e

y x, x s - T y

x

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

чае 3-диагональных систем уравнений (А i,j = 0 при |i - j| > 1) с доминирующей диагональю (|Ai,i| > |Ai,j+1|+|Ai,j-1|) очень эффективен метод "прогонки", использующий лишь эти три диагонали (если ус-

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

a0,1x0 + a0,2x1 = b0 ,

 

 

+ ai,1xi + ai,2xi+1 = bi , 1 i n - 1,

 

 

 

ai,0xi-1

 

an,0 xn-1 + an,1 xn = bn.

 

 

b0

a0,2

 

Положим u0 =

 

 

, v0 = a0,1 . Тогда из первого уравнения имеем:

 

a0,1

 

x 1 = u 0 - v 0 x 1 . Если уже найдено представление (прямой ход)

 

xi-1 = ui-1 - vi-1 x i ( i ≥ 1),

(1)

то из уравнения ai,0 (ui-1 - vi-1 xi ) + ai,1 xi + a i,2 xi+1 = b i получаем xi = ui - vi xi+1, где теперь

ui = bi - a i,0 ui-1 , vi =

ai,2

 

(i = 1, 2, ...) .

(2)

ai,1 - ai,0 vi-1

ai,1 - ai,0 vi-1

 

 

Тогда из последнего уравнения xn = un, и по формуле (1) получаем x i для всех i = n - 1, n - 2, ... , 1, 0 (обратный ход прогонки). Очевидно, что для хранения значений ui, vi можно использовать измененные xi , bi . Поэтому программа, реализующая процесс прогонки, может быть записана достаточно компактно и просто. С вычислительной точки зрения метод прогонки имеет много очевидных преимуществ перед методом итераций (прямой и обратный ход решают задачу полностью; например, программа легко справляется с системой уравнений с более чем 10000 неизвестных). В Mcd метод можно оформить в виде следующей функции:

158

Prog(A, b) := n Last(b)

x 0 b 0 (A 0, 1) -1, b 0 A 0, 2 (A 0, 1) -1

for i 1 .. n

p (A i, 1 - A i, 0 b i - 1) -1

x i (b i - A i, 0 x i - 1) p, b i A i, 2 p for i n - 1 .. 0

x i x i - b i x i + 1

x

Пример 4. Найдем приближенное решение линейной краевой задачи x(3x2+1)y''(x) + 2y'(x) – 6xy(x) = 4-12x2 на отрезке [1, 2] с усло-

виями у(1) = у(2) = 0. Здесь нетрудно найти точное решение f(x) = 2x - -0.75(x2+1) - 2x1 . Разобьем отрезок [1, 2] на n равных частей с шагом h =

1

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

вами: y'(xi) ≈ yi+1 - yi-1, y''(xi) ≈ (yi+1

- 2yi + yi-1)h-2, где yi = y(xi), xi =1+

i

, i.

n

2h

 

 

После приведения подобных членов дифференциальное уравнение превращается в линейную трехдиагональную систему алгебраических уравнений:

(n2xi(3xi2+1)-n) yi-1 - (2n2xi(3xi2+1)-6xi) yi + (n2xi(3xi2+1)+n) yi+1 = 4-12xi2,

i = 1, ..., n - 1, y0 = yn = 0. Несложно проверить, что диагональ матрицы системы доминирующая, поэтому удобно применить метод прогонки.

6.2.1.2. Нелинейные уравнения и системы А. Для одного уравнения на числовой прямой простые итерации

типа xn+1 = f(x n) (n = 0, 1, ... , x 0 – начальное приближение) приводят при n ∞ к решению уравнения x = f(x), если выполнено (достаточное) условие |f ′(x)| M < 1 в некоторой окрестности точного решения.

Уравнение f(x) = 0 всегда можно привести к указанному виду, записав его как x = x + k f(x) (k – параметр релаксации). Тогда итера-

ции xn+1 = xn + k f(xn) (n = 0, 1, 2, …) будут сходиться при условии |1+ k f ′(x)| M < 1 (условие можно выполнить, если в окрестности решения f ′(x) ≠ 0). Можно потребовать на каждом шаге выполнения равенства 1+ k f′(x n) = 0, откуда k=-(f′(xn)) -1 - это метод Ньютона:

xn+1 = xn - (f′(xn))-1 f(xn). Например, m a получается как решение уравнения xm - a = 0 и метод Ньютона здесь приводит к итерациям xn+1 =

(m-1) x n + a x n1 - m, х 0 = 1 (например), которые быстро сходятся к точному

m

решению для произвольного m > 1.

159

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

гая k = xn-1 - xn = - (f′( )) -1 для некоторого : (xn - ) ( - xn-1) > 0, f(xn ) - f(xn-1)

что приводит к методу (секущих, квазиньютона):

xn+1 = f(xn) xn-1 - f(xn-1) xn (n = 1, 2, ... ). f(xn) - f(xn-1)

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

Relax(f, x, k) := n ← 0, t ← x + 1, ε ← 0.000001

while |t - x| >

t ← x, n ← n + 1 x ← t + k f(t)

x

f(x)

n

QuaNew(f, x) := n ← 0, z ← x + 1, ε ← 0.000001

y ← x + 100 , fx ← f(x), fy ← f(y)

while |z - x| >

z ← (fy x - fx y) (fy - fx) -1 x ← y, y ← z, fx ← fy

fy ← f(z), n ← n + 1

z

f(z)

n

Пример 1. Сравним оба метода при поиске решения уравнения ln(x) = (1 + x2) -1, или (1 + x2) ln(x) - 1 = 0, т. е. f(x) = 0, где f(x) = (1 +

x2) ln(x) –

1,

и с

результатом работы блока Given ... Find. Поиск

начинается всюду с точки

х = 2. Обе программы дают приближенное

решение

х =1.4013215 и

х =1.4013216 со значением функции в

первом случае

-2.6 10 -7, во втором 2.14 10 -12. Релаксация требует при

k = - 0.1, -0.3, -0.5

n = 27, 7 и 18 итераций. Метод секущих (QuaNew)

достигает результата за семь итераций. Встроенный блок Given ... Find находит значение х = 1.4013212 со значением функции - 1.169 10 -6.

160

Б. Для нелинейных систем уравнений F(x) = 0 (F: n n ), используя метод Ньютона, аналогично предыдущему получим:

x (n + 1) = x (n) - [DF(x (n))] -1 F(x (n)) , n = 0, 1, ... ,

где DF(x(n)) - матрица частных производных F в точке x (n). Здесь на каждой итерации нужно решать линейную систему уравнений

DF(x(n)) (x(n + 1) – x(n)) = - F(x(n))

относительно вектора s = x(n + 1) – x(n) . Тогда процесс уточнения решения принимает вид (здесь D(f, х) = Df(х)):

Zero(F, D, x, ) := d ← 1

while d >

s ← Lsolve(D(f,x), f(x)) x ← x – s

d ← |s|

x

f(x)

Например, для двух функций с двумя переменными имеем:

f1(x, y)

F(x, y) = ) ,

f2(x, y

 

∂f1(x,y)

∂f1(x,y)

 

DF(x, y) =

∂x

∂y

.

∂f2(x,y)

∂f2(x,y)

 

∂x

∂y

 

Здесть можно использовать меню Анализа (см. рис. 55). При большой размерности пространства проще использовать собственную программу дифференцирования (см. конец п. 6.1).

Пример 2. Рассмотрим систему трех уравнений с тремя неиз-

 

9y2

- 16x2 = 7,

 

 

 

- 9y2 = 5,

 

вестными

4z2

с отправной точкой x = y = z = 2.

 

 

 

 

 

xy + xz + yz = 1

 

Положим n = 3

i := 0 . . n - 1 x i := 2 , введем вектор-функцию

9 (x1)2 - 16 (x0)2 - 7 f(x) := 4 (x2)2 - 9 (x1)2 - 5

x0 x1 + x0 x2 + x1 x2 - 1

и выполним R := Zero(f, D, x, 10 -6) . Обратим внимание на то, что ре-

зультат R является вектором, компоненты которого (их нельзя назвать "координаты") также векторы. Поэтому непосредственный вывод

{3; 1}

результата в Mсd выглядит так: R = {3; 1} (каждый элемент – мат-