
Информатика
.pdf161
рица из трех строк и одного столбца, т. е. вектор). Получим решение
|
|
|
|
|
|
|
|
|
-2.36 10 |
|
|
|
|
|
-0.25819889 |
|
|
|
- 13 |
||
R 0 |
и значение R 1 |
функции f: R 0 |
0.94672926 |
|
, |
R 1 |
1.08 10 |
- 13 |
||
= |
|
= |
|
|||||||
|
|
|
|
1.80739223 |
|
|
|
|
0 |
|
-практически точно.
Втех случаях, когда точность решения не принципиальна, либо его вообще не существует, достаточно найти псевдорешение, как результат решения соответствующей задачи оптимизации (например, в методе наименьших квадратов). При этом можно воспользоваться блоком Given ‹условия› Minerr.
6.2.2. Определенный интеграл
Различные практические методы интегрирования встроены в меню Анализа (см. рис. 55). Для знакомства с методами вычисления определенных интегралов в конечных пределах стандартно используется приближенное представление площади плоской области между графиком y = f(x), x [a, b] и осью абсцисс.
На каждом промежутке [t i , t i + 1], t i = a + i b - a |
(i = 0, ... , n) фун- |
n |
|
кция представляется в каком-нибудь простейшем виде (что, собственно, и определяет метод приближенного интегрирования).
В формуле прямоугольников на каждом отрезке разбиения функ-
ция считается постоянной, и тогда для h = b - a |
имеем: |
||
|
|
n |
|
b |
n - 1 |
|
|
I = a |
f(x) dx ≈ h i = 0 |
f(a + (i + 0.5) h). |
В формуле трапеций на каждом промежутке функция представляется отрезком прямой. В этом случае имеем:
I = ba f(x) dx ≈ h∙(f(a)+f(b)2 |
+ in=- 11 f(a + i h)). |
Вообще же, если позволить выбирать точки 0 x 1 < x 2 < ... < x k 1, то можно определить формулу
10 f(x) dx ≈ ik= 1 a i f(x i) , |
(3) |
где коэффициенты {a i} ik= 1 выбираются так, чтобы формула была то-
чна для многочленов наиболее высокой степени. При k = 1, x 1 = 0.5, a 1 = 1 имеем формулу прямоугольников, при k = 2, x 1 = 0, x 2 = 1, a 1 = = a 2 = 0.5 получим формулу трапеций и т. д.
Наиболее популярны так называемые формулы Гаусса типа (3) с оптимальным выбором не только коэффициентов ai , но и узлов {xi }. Можно показать (это делается в отдельных курсах численных мето-

162
дов), что в качестве {xi} следует брать корни многочленов Гаусса,
ортогональных на [0, 1] (многочлены Pm (x) и |
Pn (x), m ≠ n, ортого- |
|
нальны на [0, 1], если |
01 Pm (x) Pn (x) dx = 0). |
Например, первые два |
такие многочлена суть |
P1 (x) = 2 х – 1, P2 (x) = |
6 х 2 - 6 х + 1. Первый |
имеет корень х = 0.5 (так что приведенная формула прямоугольников является простейшей формулой Гаусса), второй имеет два корня x1,2 =
3 ± 3 |
и таким образом формула |
|
|
|
|
|||
6 |
|
|
|
|
|
|
|
|
|
|
1 f(x) dx ≈ 1 |
|
|
|
|
|
|
|
|
[f( 3 - |
3 ) + f( 3 + 3 )] |
|||||
|
|
0 |
2 |
6 |
6 |
|
|
оказывается точной для многочленов 0, 1, 2, 3-й степени. Полагая s =
= 3 - 3 |
, t = 1 - s, h = b - a , можно теперь записать |
|
||||
6 |
|
|
n |
|
|
|
|
|
b |
f(x) dx ≈ h |
n - 1 |
[f(a + (i + s) h) + f(a + (i + t) h)] . |
|
|
|
|
|
(4) |
||
|
|
a |
2 |
i = 0 |
|
|
Формулы Гаусса - "открытого" типа (не используют значений функции в узлах сетки) и могут применяться к несобственным интегралам и
интегралам типа Коши. Например, для 3-1 dxx = ln(3) (=1.0986122…)
при а = -1, b = 3, n = 40 по формуле (4) получим значение с восемью точными знаками. Аналогично можно построить формулы вида:
∞ f(x) e -x 2dx ≈ k |
a i f(x i) . |
(5) |
|
||||
0 |
i = 1 |
|
|
|
|||
Например, при k = 3, |
х 1 = 0.19055415, х 2 = 0.848251867, х 3 = |
|
|
||||
= 1.799776578, а 1 = 0.44602977, а 2 = 0.396468267, а 3 = 0.043728888 |
и |
||||||
для функции f(x) = (2 + x -2) ln(1 + x) - |
1 |
|
по формуле (5) получа- |
||||
x (x + 1) |
|||||||
|
|
|
|
|
ем 0.99991525 при точном значении 1.
В действительности равномерное разбиение промежутка интегрирования (постоянный шаг) не всегда целесообразно и существует много способов адаптировать его к поведению функции (что Mcd и делает). Самый простой (с алгоритмической точки зрения) способ – это использование рекурсий (см. п. 1.6). Для каждом этапе рекурсии реализуется конкретный метод интегрирования на одном шаге, шаг (точнее, промежуток) затем делится пополам, и на каждой половине снова вычисляется интеграл. Если результат вычисления изменился меньше допустимой погрешности, то он выдается, как окончательный, иначе дробится далее каждая половинка промежутка и процесс повторяется (рекурсия). В таком случае выбор разбиения отрезка интегрирования осуществляется автоматически в соответствии с требуемой точностью. Для метода прямоугольников, например, функция вычи-

163
b
сления интеграла ∫a f(x)dx с (абсолютной) погрешностью ε = 0.0001 выглядит так:
Int(f,a,b) := |
|
ε ← 0.0001, s ← a+b, h ← b-a |
||||||||||
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
r ← h∙f(s), h ← 0.5∙h |
|
|
|||||||
|
|
|
|
|
|
|
|
|
a+s |
s+b |
||
|
|
|
p ← h∙f 2 , q ← h∙f 2 |
|
|
|||||||
|
|
|
|
(| |
| |
|
) |
|||||
|
|
|
if |
|
p+q-r < ε,p+q,Int(f,a,s)+Int(f,s,b) |
|||||||
Пример. Для функции f(x) = |
1 |
|
вычислим значение интег- |
|||||||||
2-cos(x) |
||||||||||||
3 |
(= 2arctg( |
|
|
|
|
3tg(1.5)) ) по |
|
|
||||
|
|
|
|
|
|
|||||||
рала ∫ f(x)dx |
|
|
|
приведенной программе и |
||||||||
|
|
|||||||||||
0 |
|
|
|
|
3 |
|
|
|
встроенными средствами. Получили: Int(f,0,3) = 1.7665441884, Mcd возвратил 1.7665491915, "точное" значение 1.7665491915 – требуемая точность выполнена (с избытком).
6.2.3. Функции на дискретном множестве
Если функция задана конечным числом своих значений, аналитическое меню Mcd оказывается бесполезным, поскольку классические операции анализа на таких функциях неопределены. Продолжение таких функций на числовую область называется интерполяцией (восполнением) или аппроксимацией (приближением) в зависимости от метода и цели задачи. Простейшим инструментом здесь является метод Лагранжа: если функция задана своими значениями y0, y1, ..., yn
в точках соответственно x0, x1, ..., x n, то многочлен (Лагранжа)
n |
|
(t-x0)...(t-xi-1) (t-xi+1)...(t-xn) |
|
|
Ln (t) = |
yi |
|
||
(xi - x0)...(xi - x i-1) (xi - xi+1)...(xi |
- xn) |
|||
i = 0 |
|
определен для всех t и Ln (x i) = yi (i = 0, ..., n). В терминах Mcd этот многочлен можно определить формулой
n |
n |
t - xj |
|
|
Ln(t) := |
yi П if(i = j, 1, |
). |
||
|
||||
i = 0 |
j=0 |
xi - xj |
C помощью аппарата разделенных разностей этот многочлен можно записать в ином виде.
Более гибким инструментом для решения задач интерполяции являются сплайны, представляющие собой агрегат, гладко склеенный из многочленов фиксированной степени (в данном случае три). Встроенные функции lspline, pspline, cspline позволяют найти значения вторых производных сплайнов по данным x={xi}, y={yi}, после чего сам
164
процесс интерполяции осуществляется функцией interp: сначала вычисляется вектор vs := cspline(x, y), например, затем определяется функция f(t) := interp(vs, x, y, t), интерполирующая массивы данных x,
y кубическим сплайном в точке t.
Пример. Пусть функция задана в точках {xi} = {0, 2, 3.5, 4.5, 7} значениями {yi} = {0, 0, 1, 0, 1}. Интерполируем ее значения на равномерную сетку {zj = j - 1, j = 0, ..., 9} с помощью многочлена Лагранжа (функция L(t)), сплайна с параболическими краевыми условиями (функция f(t)) и продифференцируем полученные функции. В результате получим таблицу:
Таблица 11
z |
- 1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
|
|
|
|
|
|
|
|
|
|
L(z) |
7.426 |
0 |
-1.17 |
0 |
0.987 |
0.647 |
-0.78 |
-1.67 |
1 |
11.61 |
|
|
|
|
|
|
|
|
|
|
|
f(z) |
1.288 |
0 |
-0.43 |
0 |
0.917 |
0.584 |
-0.38 |
-0.26 |
1 |
3.406 |
|
|
|
|
|
|
|
|
|
|
|
L′(z) |
-12.2 |
-3.53 |
0.54 |
1.385 |
0.398 |
-1.04 |
-1.54 |
0.273 |
5.790 |
16.40 |
|
|
|
|
|
|
|
|
|
|
|
f ′(z) |
-1.72 |
-0.86 |
0 |
0.859 |
0.603 |
-1.15 |
-0.46 |
0.687 |
1.833 |
2.979 |
|
|
|
|
|
|
|
|
|
|
|
Можно для той же цели использовать подходящую систему функций { i(t)} и подобрать в представлении R(t) = i ai i(t) коэффици-
енты ai наилучшим (в требуемом смысле) образом. Это линейная задача и она легко решается методами п. 6.2.1. Если в данном примере взять r(t) = (t 2 + 1) - 1 и положить i (t) = r(t - x i) (трансляции функции r), a коэффициенты a i ( i) выбрать из условий интерполяции: R(x i) = yi ( i), то в результате получается аналитическая кривая (см. рис. 66). Вектор коэффициентов получается из системы линейных уравнений
A a = y c матрицей A i, j = r(xi - xj ), i, j. Можно положить a = A- 1 y (или a=lsolve(A,y)) и определить R(t) = a r(t - x) (скалярное произведение) либо указанной выше суммой.
Из приведенного рисунка (см. рис. 66) видно, что многочлен Лагранжа больше остальных агрегатов колеблется относительно предполагаемых значений и, конечно же, не пригоден для анализа поведения функции (тем более, экстраполяции). Сплайны ведут себя значительно "спокойнее" (они строятся по условию минимальности изгиба). Теоретические оценки их отклонений позволяют использовать сплайны для приближенного дифференцирования функций. Для экстраполяции и они не очень пригодны. Все приведенные агрегаты "безлики", а экстраполяция должна отслеживать суть явления (см., например, п. 6.2.6).

165
|
|
|
|
|
|
Рис. 66 |
|
|
|
Наконец, |
на равномерной сетке |
xi+1 - xi =h ( i) можно построить |
|||||||
формулы приближенного дифференцирования в узлах xi вида |
|||||||||
y (s) h s |
= k |
aiyi, где yi = y(xi), i. Используя формулу Тэйлора, из |
|||||||
m s! |
i = 0 |
|
|
|
|
|
|
|
|
равенств k |
ai k |
y(j) [(i - m) h] j = y(s) h s +o(hk+1) нетрудно получить |
|||||||
|
i = 0 |
j = 0 |
m |
|
j! |
m s! |
|
|
|
для коэффициентов {a i} линейную систему уравнений |
|||||||||
|
k |
|
|
|
1, |
i = s |
|
|
|
|
aj (j - m) i = |
|
|
|
|
||||
|
|
0, |
i ≠ s (i = 0, ..., k) |
|
|
||||
|
j = 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1, |
i = s |
с матрицей A i,j = (j - m)i |
|
|
|
|
|||||
и правой частью bi = |
0, |
i ≠ s . Отсюда, напри- |
|||||||
|
|
|
|
|
|
|
|
|
|
мер, следуют популярные формулы вычисления второй производной:
y0′′ h 2 ≈2 y0 - 5 y1 + 4 y2 - y3, yi′′ h 2 ≈ yi-1 -2 yi + yi+1, yn′′ h 2 ≈ 2 yn - 5 y n-1 + 4 yn-2 - yn-3, и др. Приведем таблицу некоторых часто используемых формул приближенного дифференцирования (табл. 12 – 13).
|
|
|
|
|
|
|
|
Таблица 12 |
|
|
|
|
|
|
|||
|
|
|
Формулы для вычисления ym' h∙k! порядка k |
|||||
m |
|
k = 2 |
|
|
k = 3 |
|
k = 4 |
|
0 |
-3y0 +4y1 –y2 |
-11y0 +18y1 -9y2 +2y3 |
2(-25y0+48y1-36y2+16y3-3y4) |
|||||
1 |
|
-y0 +y2 |
-2y0 -3y1 +6y2 -y3 |
2(-3y0-10y1+18y2-6y3+y4) |
||||
2 |
y –4y +3y |
y -6y +3y +2y |
2( y -8y1 +8y3-y4) |
|||||
|
0 |
1 |
2 |
0 |
1 |
2 |
3 |
0 |
3 |
|
|
|
-2y0 +9y1 -18y2 +11y3 |
2(-y0+6y1-18y2+10y3+3y4) |
|||
4 |
|
|
|
|
|
|
|
2(3y0-16y1+36y2-48y3+25y4) |
|
|
|
|
166 |
|
|
|
|
Таблица 13 |
|
|
|
|
|
|
|
Формулы для вычисления y''m h2 порядка k |
||
m |
k = 2 |
|
k = 3 |
k = 4 |
0 |
y0-2y1+y2 |
|
2y0-5y1+4y2-y3 |
(35y0-104y1+114y2-56y3+11y4) / 12 |
1 |
y0-2y1+y2 |
|
y0-2y1+y2 |
(11y0-20y1+6y2+4y3-y4) / 12 |
2 |
y0-2y1+y2 |
|
y1-2y2+y3 |
(- y0+16y1-30y2+16y3-y4) / 12 |
3 |
|
|
-y0+4y1-5y2+2y3 |
(-y0+4y1+6y2-20y3+11y4) / 12 |
4 |
|
|
|
(11y0-56y1+114y2-104y3+35y4) / 12 |
6.2.4. Обыкновенные дифференциальные уравнения
Как известно, всякую задачу Коши для системы обыкновенных дифференциальных уравнений в нормальном виде можно представить системой уравнений первого порядка, поэтому ограничимся рассмот-
рением задачи |
|
x′(t) = f(t, x) |
. Точное (аналитическое) решение удается |
|
x(0) = x0 |
||
|
|
|
найти лишь в исключительных случаях, поэтому широко распространены приближенные (численные) методы. Простейший - способ Эйлера, использующий правую часть уравнения для проведения касательной к решению: если ti = i h (i = 0, 1, ...), то
xi = x(ti) ≈ xi-1 + h f(t i - 1, x i - 1),
что легко реализуется кодом (n задано, h выбрано):
i := 0 . . n t i := i h x i := if(i = 0, x0 , xi-1 + h f(ti-1, xi-1) .
Этот алгоритм плохо сходится даже для "хороших" задач, однако он легко улучшается, если перемещаться по направлению среднему из направлений в соседних узлах (модифицированный метод), полагая
ki = xi + h f(ti, xi), xi+1 = xi + 0.5 h (f(ti, xi) + f(ti+1 , ki)), i = 0, 1, ... .
Рунге и Кутта довели модификацию до логического конца. Приведем пример метода Рунге - Кутты четвертого порядка (наиболее популярный в вычислительных моделях):
x i := |
|
p ← x0 if i = 0 |
|
||
|
|
||||
|
|
otherwise |
|
||
|
|
|
k1 |
← f(t i - 1, x i - 1) h |
|
|
|
|
k2 |
← f(t i - 1+ 0.5 h, x i - 1 |
+ 0.5 k1) h |
|
|
|
k3 |
← f(t i - 1 + 0.5 h, x i - 1 |
+ 0.5 k2) h |
|
|
|
k4 |
← f(t i - 1 + h, x i - 1 + k3) h |
|
|
|
|
p ← x i - 1 + (k1 + 2 k2 + 2 k3 + k4) 6 - 1 |
||
|
|
p |
|
|

167
Mсd имеет несколько встроенных функций для решения задачи Коши различными методами (Bulstoer, Rkadapt, rkfixed, Stiffb и др.), а
также блок Given ... Odesolve для определения функции-решения (см. п. 6.1). В "штатных" ситуациях нет необходимости вникать в суть алгоритмов.
Пример 1. Найдем решение уравнения y′ = |
y 3 |
+ x + 1 |
на [0, 5] с |
|
3y 2 |
начальным условием у(0) = 1 методом rkfixed с шагом h = 0.25 ( в 20 точках) и блоком Given ... Odesolve и сравним результат с точным ре-
шением y(x) = 3 3e x - x - 2 (Ctrl + F7 вводит знак производной):
|
x |
3 |
+ t + 1 |
3 |
|
|
|
|
|
||
F(t, x) := |
D(t, y) := F(t, y 0) r(t) := |
3 e |
t |
- t - 2 |
|
||||||
|
|
||||||||||
|
3 x |
2 |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||
y0 = 1 M := rkfixed(y, 0, 5, 20, D) s := M ‹ 0 › |
|
|
|
|
|
||||||
Given |
|
|
|
|
|
|
|
|
|
|
|
y′(x) = y(x) 3 + x + 1 |
y(0) = 1 |
|
|
(клавиша "Ctrl+F7") |
|||||||
|
|
3 y(x) 2 |
|
|
|
|
|
|
|||
|
|
|
|
|
|
| r(s) - M‹1› | = 4.311 10 - 6 |
|
|
→ |
10 - 5 |
|
f := odesolve(x,5) |
| r(s) - f(s) | = 2.769 |
Здесь M‹0› = {ti} - вектор значений аргументов (сетка), M‹1› = {yi} - вектор значений решающей функции, значение функции на векторе есть вектор соответствующих значений функции, однако результат работы Odesolve требует в этом случае векторизации (знак "→ ").
Блок Given ... Odesolve (начиная с версии 12) позволяет решать также и системы обыкновенных дифференциальных уравнений. При использовании различных вычислительных схем решения задачи Коши уравнение (или систему уравнений) полезно привести к системе уравнений первого порядка, разрешенной относительно производных искомых функций. К этой (нормальной) системе уравнний уже можно применить подходящий алгоритм из существующего в библиотеке набора. Тем не менее, условия работы встроенных алгоритмов довольно ограничены, и нередко приходится выписывать программы "вручную".
Пример 2. Рассмотрим задачу стрельбы в реальной среде (с сопротивлением) по мишени. Будем считать мишень пораженной, если снаряд разорвался не более, чем в r м. от мишени. Обозначим через v =
x'(t)
v(t) = y'(t) вектор скорости снаряда. На него действует сила земного тяготения и сопротивление воздуха. При большой скорости движения силу сопротивления среды можно считать пропорциональной квадрату скорости. Поэтому движение снаряда сожно описать (векторным) ура-
внением v'(t) = 0g – λ|v(t)|v(t) с начальными условиями: х(0) = у(0) = 0, x'(0) = c∙cos(φ), y'(0) = c∙sin(φ), где с – начальная скорость снаряда, φ –

168
угол прицела (по отношению к горизонтали). Запишем уравнение в ви-
де нормальной системы: введем вектор u 4, полагая u0 = x, u1 = y, u2 = x', u3 = y'. Очевидно, система уравнений теперь примет вид: u0' = u2, u1'=
u3, u2'= -λu2 |
u22 + u32 |
, u3' = -λu3 |
|
u22 + u32 |
- g, или u'(t) = D(t,u) с правой |
|||||||||||
|
|
|
|
u2 |
|
|
|
|
|
|
|
|
0 |
|
||
|
|
|
u3 |
|
|
|
|
|
|
0 |
||||||
частью D(t,u) = |
|
|
|
|
|
|
|
и начальными условиями u = |
. |
|||||||
|
|
2 |
+ u3 |
2 |
c∙cos(φ) |
|||||||||||
|
|
-λu2 |
|
u2 |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
c∙sin(φ) |
|
|||
|
|
2 |
|
2 |
-g |
|
|
|||||||||
|
|
-λu3 |
u2 |
+ u3 |
|
|
|
|
|
|
Здесь невозможно воспользоваться ни одной встроенной функцией, требующей точного указания времени полета (а его-то и нужно найти!). Поэтому напишем собственный код (в нем z – координаты точки цели в плоскости полета, r – радиус зоны поражения, h – шаг интегрирования):
Blast(u,z,r,h,D) : = t ← 0
while t ≥ 0
k1 ← D(t,u)∙h
k2 ← D(t+0.5∙h, u+0.5∙k1)∙h
k3 ← D(t+0.5∙h, u+0.5∙k2)∙h
k4 ← D(t+h, u+k3)∙h
x← x+(k1+2∙(k2+k3)+k4)∙6-1
t←t+h, p ← u0
u1
if |p-z| < r
return "цель поражена", break
if u1 < 0
return "промах", break .
Решение краевых задач существенно сложнее и часто сводится к решению подходящих задач Коши (см. встроенные функции Mcd: bvalfit, sbval и др.). Блок Given ... Odesolve справляется и с некоторы-
ми краевыми задачами. Многие задачи (особенно линейные) можно приближенно решить уже известными средствами: на равномерной сетке {x i} c шагом h производные удобно заменять разностными соотношениями (см. п. 6.2.3) и тогда задача сводится к системе (вообще говоря нелинейных) алгебраических уравнений, которые можно решать методом Ньютона или (для линейных) прогонки (см. п. 6.2.1.1).
Пример 3. Рассмотрим такую задачу: найти функцию x(t), график которой проходит через точки (0, 2) и (2, 0) и значение выражения (t2 + 1)x'(t) + tx(t)2 постоянно на [0, 2], т.е следует найти константу С и функцию x(t),для которых (t2 + 1)x'(t) + tx(t)2 = C, x(0) = 2, x(2) = 0. Это
– "нестандартная" краевая задача, она встроенными средствами не решается, но можно воспользоваться идеями существующих алгоритмов. Например, функция bvalfit подбирает начальные условия для задачи Коши так, чтобы решение удовлетворяло краевым условиям

169
(метод "стрльбы"). При заданном С наше уравнение определяет в точке t = 0 производную x'(0) = C (угол стрельбы). Решая для разных С задачу с помощью, например, odesolve, несложно подобрать значение константы С так, чтобы х(2) ≈ 0. Здесь много "ручной" работы – подбора. Если запрограммировать метод Рунге-Кутты, то подбор можно
z - t∙x
сделать автоматическим. Введем функцию D(t,x,z) = t2 +1 , определя-
ющую x'(t) при С=z. Найдем решение уравнения в точке t=2 методом Рунге-Кутты с постоянным шагом в виде функции:
f(z) := |
|
n← 200, h← 2 , t← 0, x← 2 |
|
|
|||
|
|
|
n |
|
|
for i 1 .. n |
|
|
|
|
k1← D((i-1)∙h,x,z)∙h |
|
|
|
|
|
|
|
k2← D((i-0.5)∙h,x+0.5∙k1,z)∙h |
|
|
|
k3← D((i-0.5)∙h,x+0.5∙k2,z)∙h |
|
|
|
k4← D(i∙h,x+k3,z)∙h |
|
|
|
x← x+[k1+2∙(k2+k3)+k4] -: 6 |
|
|
x |
Далее, положив, например, z = 0, в блоке Given f(z)=0 C Find(z) найдем С = -1.4.
6.2.5.Минимизация функций
Впакете Mathcad есть функции Minimize, Maximize, Minerr.
Если необходимо решать задачу с ограничениями (типа равенств или неравенств), то последние записываются в блоке Given ... . Функция Minerr минимизирует среднеквадратичную разницу левой и правой части уравнения по выбранным параметрам (специальная минимизация, см. п. 6.1). Указанные функции реализуют различные (достаточно эффективные) методы. Правый щелчок мыши по выделенной функции открывает меню доступных методов и поз-
воляет настроить процесс решения задачи (см. рис. 67).
"Кухня" процессов минимизации непроста, познакомимся лишь с некоторыми простейшими (с точки зрения программирования) ее аспектами (детали излагаются в соответствующих курсах численных методов).
6.2.5.1. Функции одной переменной Если производная функции неизвестна (или не интересует), то
стартуя из заданной точки с выбранным шагом, можно всегда двигать-

170
ся в сторону убывания функции (для задач на минимум), считая такое движение "удачным". Для ускорения поиска можно увеличивать шаг при удачном движении и уменьшать шаг, меняя его направление, при неудачном движении до тех пор, пока шаг не станет достаточно малым. Опыт и здравый смысл показывает, что увеличивать шаг следует осторожно, например, заменяя h на 1.2 h, уменьшать же шаг следует решительнее, например, заменяя h на - 0.2 h. Приведем пример соответствующей программы-функции:
Min1(f, x, h, ) := fx ← f(x), n ← 0
while | h | > 0.2
a ← x, x ← x + h, n ← n + 1 fa ← fx, fx ← f(x)
h ← if (fx < fa, 1.2 h, - 0.2 h)
x |
|
|
|
f(x) |
|
|
|
n |
|
|
|
|
|
|
|
|
|
x 4 + 1 |
|
Пример 1. Для функции f(x) = |
|
x 2 + 1, начиная с точки х = 5 с |
|
шагом h = 1 и = 10 – 5, получим |
х = - 0.99999, f′(x) = 7.0097 10 - 6 |
за 70 вычислений функции (встроенная функция minimize возвращает точное значение х = 1).
Если известны значения производной функции f′(x) = g(x), то задача сводится к решению уравнения g(x) = 0 и можно использовать любой оговоренный выше метод. Можно, однако, найти "удачную" пару точек х1, х2: f′(x1) f'(x2) < 0, построить в них касательные к гра-
фику y = f(x): Y = f(x1) + g(x1) (X - x1) и Y = f(x2) + g(x2) (X - x2) и
точку их пересечения x* = x2 g(x2) - x1 g(x1) + f(x1) - f(x2) можно ввести в
g(x2) - g(x1)
число "удачных", если x* [x1, x2]. Процесс заканчивается, когда изменение g(x) на удачной паре точек станет меньше оговоренного уровня. Приведем пример программ, реализующих поиск минимума f(x) через решение уравнения g(x) = 0 (Min2) и использующих пересечение касательных (Min3).
Min2(g, x, h, ) := |
n ← 1, gx ← g(x), h ← - |h| sign(gx) |
|
|
while |h| > 0.1 |
|
|
|
a ← x, ga ← gx, x ← x + h |
|
|
|
|
|
gx ← g(x), n ← n + 1 |
|
|
h ← if(gx ga > 0, 1.2 h, - 0.2 h) |
|
|
x
g(x)
n