Вы находитесь на странице: 1из 59

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ «МАМИ»

В.И.Калядин

Решение задач в Excel на VBA


ПРИМЕНЕНИЕ ПРОГРАММНЫХ СРЕДСТВ В ПРОЕКТИРОВАНИИ
АВТОМОБИЛЬНЫХ КОНСТРУКЦИЙ
Допущено УМО вузов РФ по образованию в области транспортных
машин и транспортно-технологических комплексов в качестве
учебного пособия для студентов, обучающихся по специальности
Автомобиле- и тракторостроение

Одобрено методической комиссией по математическим и


естественнонаучным дисциплинам

МОСКВА 2011
УДК 681.3.06
Разработано в соответствии с Государственным образовательным
стандартом ВПО 2000 г. для специальности Автомобиле- и тракто-
ростроение на основе рабочей программы дисциплины «Информатика»

Рецензенты: с.н.с. ФГУП «ЦНИРТИ им. академика А.И.Берга»,


к.т.н. В.Ф.Блохина;
доцент кафедры «Автоматизация процессов управления», к.т.н.
Ю.А.Савостьянок.

Работа подготовлена на кафедре "Информационные системы и дис-


танционные технологии"

Калядин В.И. Решение задач в Excel на VBA. Применение программ-


ных средств в проектировании автомобильных конструкций. Учебное
пособие по дисциплине «Информатика» для студентов, обучающихся
по специальности Автомобиле- и тракторостроение. М.: МАМИ, 2010.
48 с.: ил.

Пособие поможет закрепить и углубить знания по алгоритмизации и


программированию и подготовить студентов к решению инженерных и
научных задач в Excel на VBA.

©Калядин В.И.,2011.
©МГТУ «МАМИ», 2011.
2
Введение
В настоящем пособии рассматривается решение задач в Excel с ис-
пользованием VBA (Visual Basic for Applications – визуального Бейсика
для приложений). Освоение программирования на VBA позволяет вы-
полнять расчеты в Excel более эффективно (на более высоком уровне),
использовать макросы и функции пользователя. В пособии разбираются
приѐмы решения задач с подключением макросов, приводятся примеры
их написания, примеры использования процедур dll-библиотек и вклю-
чения в Excel «функций, определѐнных пользователем». Задачи, приве-
дѐнные в пособии, могут быть использованы как итоговые задания при
завершении изучения программировании на VBA (и как темы заданий
при дальнейшем изучении студентами численных методов).
1. Действия с массивами в Excel и в VBA
1.1. Процедуры ввода-вывода массивов
При решении задач в VBA ввод-вывод простых переменных из файла
осуществляется операторам Input и Print, а из ячейки рабочего листа
Excel по оператору присваивания вида X=Cells(2,3). Можно вводить из
формы и выводить на форму с использованием элементов управления
TextBox и Label. Но в этом случае удобнее использовать специально
встроенные для этого в VBA функции InputBox и MsgBox. Табличная
форма Excel удобна для представления массивов и матриц. Однако
ввод-вывод массивов и матриц стандартными средствами VBA не все-
гда удаѐтся реализовать столь коротко и компактно как для простых
переменных. Поэтому целесообразно заготовить для этого специальные
процедуры и использовать их при решении задач для ввода-вывода
массивов (одномерных) и матриц. Далее рассмотрены такие процедуры;
их можно подключать для использования командами реактора VBA:
File, Import File… как и другие модули, имена которых указаны в При-
ложении.
В описанных ниже процедурах предполагается:
 Индексы массивов должны начинаться с нуля.
 Тип массива либо не должен объявляться, либо должен объяв-
ляться как Variant.
3
Вывод массива в файл № = NF или в окно отладки при NF = 0:
Sub PrnMas(A(), N, NF, AName$)
'Вывод массива A(N) с именем AName$ в файл № NF, в окно отладки при NF = 0.
S$ = "Массив " & AName$ & "(0:" & N & ")"
If NF = 0 Then Debug.Print S$ Else Print #NF, S$
For j = 0 To N
If NF = 0 Then Debug.Print A(j); Else Print #NF, A(j);
Next j
If NF = 0 Then Debug.Print Else Print #NF, ""
End Sub
Ввод N+1 значений элементов вектора (одномерного массива) чтени-
ем из текущего места в файле NF:
Sub IptMas(A(), N, NF)
'Ввод элементов A(0),..,A(N) массива из файла № = NF, с клавиатуры при NF <= 0.
For j = 0 To N
If NF <= 0 Then
A(j) = Val(InputBox("Задайте элемент № " & j, "Ввод массива"))
Else
Input #NF, A(j)
End If
Next j
End Sub
Пример 1.1 использования процедур IptMas, PrnMas для ввода (и выво-
да) из файла IptDat.txt чисел: 3, 2.5, 6, -2, 7, 13
Sub Test_IptMas()
Dim A(2)
Open "IptDat.txt" For Input As #1 ' файл для чтения (из папки … по умолчанию)
Call IptMas(A, 2, 1) ' вариант исх. данных ---> 3 2.5 6
-2 7 13

Call PrnMas(A, 2, 0, "A") ' результат вывода ---> Массив A(0:2)


Call IptMas(A, 2, 1) 3 2,5 6

Close 1
4
Call PrnMas(A, 2, 0, "A") ' результат вывода ---> Массив A(0:2)
-2 7 13
End Sub
Ввод в массив всех чисел (вплоть до конца) файла № =NF c опреде-
лением их количества
Sub IptMasN(A(), N, NF) ' на входе: N=max индекс массива
'Ввод элементов A(0),..,A(N) массива из файла № = NF, с клавиатуры при NF <= 0.
Dim str As Variant
For j = 0 To N
If NF <= 0 Then
str = InputBox("Задайте элемент № " & j & "или признак конца X", _
"Ввод массива")
If str = "x" Or str = "X" Then Exit For
A(j) = Val(str)
Else
If EOF(NF) Then Exit For
Input #NF, A(j)
End If
Next j
N = j – 1 ' на выходе: N= кол-во введѐнных данных-1 , но N<=max индекс массива)
End Sub

Пример 1.2 использования процедур IptMasN, PrnMas для ввода (и вы-


вода) из файла IptDat.txt чисел: 3, 2.5, 6, -2, 7, 13 (числа могут следовать
друг за другом по строкам и разделяться как запятыми, так и пробела-
ми).
Sub Test_IptMasN()
Dim A(6)
Open "IptDat.txt" For Input As #1 ' файл для чтения (из папки по умолчанию)
N=6: Call IptMasN(A, N, 1) ' вариант исх. данных ---> 3 2.5 6
Close 1 -2 7 13
Call PrnMas(A, N, 0, "A") ' результат вывода ---> Массив A(0:5)
End Sub 3 2,5 6 -2 7 13

5
Вывод матрицы в файл № NF или в окно отладки
Sub PrnMatr(A(), M, N, NF, AName$)
'Вывод матрицы A с именем AName$ в файл № = NF, в окно отладки при NF = 0.
S$ = "Матрица " & AName$ & "(0:" & M & ", 0:" & N & ")"
If NF = 0 Then Debug.Print S$ Else Print #NF, S$
For i = 0 To M
For j = 0 To N
If NF = 0 Then Debug.Print Tab(10 * j + 1); FF(A(i, j), "##0.0##"), _
Else Print #NF, Tab(10 * j + 1); FF(A(i, j), "##0.0##"),
Next j
If NF = 0 Then Debug.Print Else Print #NF, ""
Next i
End Sub
Function FF(x, frm As String) As String
FF = IIf(x > 0, " ", "-") & Format(Abs(x), frm) ' +числа c побелом в позиции знака
End Function
Ввод матрицы из файла № NF*
Sub IptMatr(A(), M, N, NF)
'Ввод матрицы A(M,N) из файла № = NF, с клавиатуры при NF <= 0.
For i = 0 To M
For j = 0 To N
If NF <= 0 Then
A(i, j) = Val(InputBox("Задайте элемент строки № " & i & ", столбца № " & j, _
"Ввод матрицы"))
Else
Input #NF, A(i, j)
End If
Next j
Next i
End Sub
* Замечание. Часто оказывается, что исходные данные из файла удобнее исполь-
зовать в таблицах, перенося их туда из открываемого стандартными средствами
Excel файла.
6
Пример 1.3 использования процедур IptMatr, PrnMatr для ввода (и вы-
вода) из файла IptDat.txt чисел: 3, 2.5, 6, -2, 7, 13 (числа – элементы
матрицы удобно расположить в файле как в матрице - по три в строке,
разделяя их пробелами или запятыми).
Sub Test_IptMatr()
Dim A(1, 2)
3 2.5 6
Open "IptDat.txt" For Input As #1 ' вариант исх. данных --->
-2 7 13
Call IptMatr(A, 1, 2, 1)
Close 1 Матрица A(0:1, 0:2)
Call PrnMatr(A, 1, 2, 0, "A") ' результат вывода ---> 3,0 2,5 6,0
-2,0 7,0 13,0
End Sub
Вывод массива в диапазон ячеек строки
Sub FromMasToRow(ByVal Row, ByVal Column, ByRef A(), ByVal N)
Jc = Column Пример 1.4. Обращение и результат вывода
For j = 0 To N Sub Row(): Dim A(1): A(0)=6: A(1)=7
Cells(Row, Jc) = A(j) Call FromMasToRow (1, 2, A, 1)
Jc = Jc + 1 A B C D
End Sub
Next j 1 6 7
End Sub
Вывод массива в диапазон ячеек столбца
Sub FromMasToColumn(ByVal Row, ByVal Column, ByRef A(), ByVal N)
' Вывод массива A(N) в диапазон ячеек $Row$Column:$(Row+N)$Column столбца
Ir = Row
Пример 1.5. Обращение и результат вывода A B
For i = 0 To N
Sub Col(): Dim A(1): A(0)=11: A(1)=22
Cells(Ir, Column) = A(i) 1 11
Call FromMasToColumn (1, 2, A, 1)
Ir = Ir + 1
End Sub 2 12
Next i
End Sub
Вывод матрицы в диапазон ячеек рабочего листа Excel
Sub FromMatrToRange(ByVal Row, ByVal Column, ByRef A(), ByVal M, ByVal N)
' Вывод матрицы A(M,N) в диапазон ячеек Row$Column:$(Row+M)$(Column+N)
Ir = Row

7
For i = 0 To M
Jc = Column
For j = 0 To N
Cells(Ir, Jc) = A(i, j)
Jc = Jc + 1
Next j
Ir = Ir + 1
Next i
End Sub
Пример 1.6 использования процедуры FromMatrToRange
Sub Test_FromMatrToRange()
Dim A(1, 2)
Open "IptDat.txt" For Input As #
3 2.5 6
Call IptMatr(A, 1, 2, 1) ' исх. данные ---> -2 7 13 A B C D
Close 1
1 3 2,5 6
Call FromMatrToRange(1, 2, A, 1, 2) ' результат вывода --->
2 -2 7 13
End Sub
Ввод массива из диапазона ячеек рабочего листа Excel
Sub FromRangeToMas(ByRef A(), ByVal N)
' Ввод массива A(N) из диапазона ячеек рабочего листа Excel
Dim R As Range
Set R = Application.InputBox(prompt:= "Укажите массив", Type:=8)
For j = 0 To IIf(R.Count - 1 > N, N, R.Count - 1)
A(j) = R(j + 1)
Next j
End Sub
Пример 1.7 использования процедуры FromRangeToMas для ввода данных:
Sub Test_FromRangeToMas()
A B C D E
Dim A(3)
1 11 12 13 14
Call FromRangeToMas(A, 3) ' выделенные ячейки --->
Debug.Print A(0); A(1); A(2); A(3) ' результат вывода ---> 11 12 13 14
End Sub

8
Ввод матрицы из диапазона ячеек рабочего листа Excel
Sub FromRangeToMatr(ByRef A(), ByVal M, ByVal N)
' Ввод матрицы A(M,N) из диапазона ячеек рабочего листа Excel
Dim R As Range
Set R = Application.InputBox(prompt:="Укажите матрицу", Type:=8)
For i = 0 To M
If i >= R.Rows.Count Then Exit For
For j = 0 To N
If j >= R.Columns.Count Then Exit For
A(i, j) = R(i + 1, j + 1)
Next j
Next i
End Sub
Пример 1.8 использования процедуры FromRangeToMatr для ввода
даных: A B C D
Sub Test_FromRangeToMatr() 1 11 12 13
Dim A(1, 2)
2 21 22 23
Call FromRangeToMatr(A, 1, 2) ) ' выделенные ячейки --->
Debug.Print A(0, 0); A(0, 1); A(0, 2) ' результат вывода ---> 11 12 13
Debug.Print A(1, 0); A(1,1); A(1, 2) ' результат вывода ---> 21 22 23
End Sub
Замечание. При выделении объединения диапазонов процедура использует лишь
первый указанный диапазон.
1.2. Изучение в Excel метода Гаусса
Задача A. Автоматизировать вычисления для практического изучения в
Excel метода Гаусса решения систем линейных алгебраических уравне-
ний (СЛАУ) с выбором главного элемента по столбцу.
Напомним один из основных методов решения СЛАУ –
метод исключения Гаусса с выбором главного элемента по столбцу.
Решение системы начинается с прямого хода, который выполняется
по шагам. На 1-ом ( k  1 ) шаге прямого хода с помощью первого урав-
нения исключают из последующих уравнений неизвестное xk (если ко-
9
эффициент при нѐм не равен нулю). Если этот коэффициент равен ну-
лю, то можно переставить местами уравнения. Для гарантии вычисли-
тельной устойчивости перед исключением неизвестных из уравнений с
k  го по n  ое выбирают и переставляют с k  ым (I-ым) то уравнение
(II-ое, см. СЛАУ к задаче A), в котором коэффициент (главный эле-
мент) при неизвестном xk наибольший по абсолютной величине:
 2x1  1x2  1x3  7 (I)  4x1  3x2  0x3  10 (II)
СЛАУ к задаче A:  4x1  3x2  0x3  10 (II) 

 2x1  1x2  1x3  7 (I)
 2x  2x  3x  11 (III)  2x  2x  3x  11(III)
 1 2 3  1 2 3

Исключение неизвестного xk  x1 выполняют по схеме (см. нумерацию


уравнений):
 4x1  3x2  0x3  10 (II) 4x1  3x2  0x3  10 (II)
 
 2x1  1x2  1x3  7 (I)  I - (2/4) (II)   0  0.5x2  1x3  2 (I)
 2x  2x  3x  11 (III)  (III) (2/4)  (II)  0  3.5x  3x  16 (III)
 1 2 3  2 3

На втором ( k  2 ) шаге также сначала выбирается главный элемент


среди коэффициентов при неизвестном xk  x2 среди уравнений с k  го
по n ое и переставляют местами строки так, чтобы строка с главным
элементом стала k  ой :
4x1  3x2  0x3  10 (II) 4x1  3x2  0x3  10 (II)
 
 0  0.5x2  1x3  2 (I)   0  3.5x2  3x3  16 (III)
 0  3.5x  3x  16 (III)  0  0.5x  1x  2 (I)
 2 3  2 3

Затем выполняют исключение неизвестного xk  x2 из строк с k 1 ой


по n ую (здесь из 3-ей строки) по схеме:
4x1  3x2  0x3  10 (II)  4x1  3x2  0x3  10 (II)
 
 0  3.5x2  3x3  16 (III)   0  3.5x2  3x3  16 (III)
 0  0.5x  1x  2 (I )  (I) - (-0.5/3.5) (III) 0  0x  1.43x  4.29 (I)
 2 3  2 3

Этим завершается прямой ход метода исключения Гаусса.


Обратный ход (или обратная подстановка) состоит в вычислении xn  x3
из последнего уравнения: xn  x3  4.29 /1.43  3 , а затем его подстановки
в уравнения, расположенные выше, и вычислении сначала
x2  (16  3 x3 ) / 3.5  (16  3  3) / 3.5  2 из 2-го уравнения, а затем и
x1  (10  3x2  0  x3 ) / 4  (10  3 2  0) / 4  1 из 1-го уравнения.
10
При решении задачи A действия выполняются над числовыми ко-
эффициентами, а имена неизвестных не участвуют в вычислениях. По-
этому при решении задачи в Excel будем хранить только коэффициенты
и значения правых частей уравнений, записывая их в расширенную
(n*(n+1))-матрицу Ab: A  x  b с расширенной (n  (n 1)) -матрицей Ab
 2 1 1   x1   7   2 1 1 7
       
 4 3 0    x2   10, Ab  Ab1   4 3 0 10
  2 2 3   x  11   2 2 3 11
   3    
Для изучения в Excel метода Гаусса с выбором главного элемента по
столбцу для решения СЛАУ используем следующий алгоритм:
a. На k-ом (k=1,..., n-1) шаге среди строк с k-ой  0 1 0
 
по n-ую выбирают ту (допустим l-ую), кото- P1   1 0 0 
рая в k-ом столбце имеет наибольший по аб-  0 0 1
 
солютной величине элемент – главный эле-
 4 3 0 10
мент. Эту строку (l-ую) матрицы Abk пере-  
P1  Ab1   2 1 1 7 
ставляют с k-ой строкой. Перестановку на k-   2 2 3 11
 
ом шаге при изучении метода в Excel удоб-
но реализовывать умножением Pk  Ab матрицы перестановок Pk на
расширенную матрицу Ab . Матрица перестановок – это единичная
матрица, в которой единицы с главной диагонали k-го и l-го столбца
переставлены соответственно в l-ый и k-ый столбцы.
b. Далее готовится (в Excel) матрица L k , умножая
 4 0 0
которую на расширенную матрицу Abk , произ-  
 2 1 0 
водят исключение неизвестных. При подготовке   2 0 1
 
(в Excel) сначала в единичную матрицу E на ме-
сто элементов k-го столбца, расположенных в  1 0 0
 
строках с k-ой по n-ую, переписывают элементы L1   - 0,5 1 0 
 0,5 0 1 
A с тем же расположением. А затем нормируют  
их – делят все переписанные эле-
 4 3 0 10
менты на главный элемент.  
Ab2  L1  P1  Ab1    0 - 0,5 1 2 
c. Затем умножением Lk  Abk выпол-  0 3,5 3 16
 
няется исключение k-го неизвест-

11
ного из строк с (k+1)-ой по n-ую, то есть фактически обнуляются со-
ответствующие элементы расширенной матрицы.
d. После (n-1)-го шага матрица системы A
4 3 0 10 
становится верхней треугольной, то есть  
Ab3   0 3,5 3 16 
имеет нули ниже главной диагонали. Ре-  0 0 1,43 4,29
шается система уравнений с верхней  
треугольной матрицей просто: из по- x3  4,29 /1,43  3
следнего уравнения находится неизвест- x2  (16  3  3) / 3,5  2
ное xn , которое затем подставляется в x1  (10  0  3  3  2) / 4  1
предыдущие уравнения. Затем находится
xn1 , и так далее. То есть осуществляется обратная подстановка ме-
тода Гаусса.
Отметим особенности реализации алгоритма
Перестановку строк выполняется умножением матрицы перестановок
на матрицу Ab. Матрица перестановок k-ой и l-ой строк – это единичная
матрица, у которой в k-ой и l-ой строках единицы с главной диагонали
смещены соответственно в l-ой и k-ой столбцы.
Для умножения матриц в Excel имеется функция МУМНОЖ, а вот для
автоматического создания единичной матрицы E в выделенной квад-
ратной области следует подготовить специальный макрос (который бу-
дем вызывать по нажатию клавиш Ctrl+Shift+E или щелчку по связанной
с макросом фигуре – кружку E, см. табл. 1.1). Операцию перестройки
единичной матрицы в матрицу перестановок будем выполнять вручную.
Исключение неизвестных на k-ом шаге выполняется умножением
матрицы исключений на расширенную матрицу. Матрица исключений
получается из единичной после замены на Abk ,k Abn,k сходственных
элементов в k-ом столбце и их нормировании – делении на элемент
Abk ,k . Эту замену можно выполнять вручную (специальной вставкой), а
вот для нормирования полезно разработать специальный макрос (его
будем вызывать по нажатию клавиш Ctrl+Shift+L или щелчку по L-
кружку).
Обратный ход метода Гаусса можно выполнять вручную, но можно
подготовить для этого (и с целью контроля) специальный макрос, ко-

12
торый будет решать СЛАУ с верхней треугольной матрицей (его будем
вызывать по нажатию клавиш Ctrl+Shift+x или щелчку по x-кружку).
Макрос, используемый на этапах a и b алгоритма:
Sub E( ) ' Запускается по Ctrl+Shift+E и создаѐт единичную матрицу E
Dim TR As Range ' в выделенной прямоугольной области.
Dim n As Integer
For Each TR In Selection.Areas ' Цикл по выделенным областям.
n = Sqr(TR.Count) ' Определение числа выделенных ячеек.
i1 = TR.Row: j1 = TR.Column ' Номера начальных строки и столбца.
TR = 0 ' Обнуление диапазона и запись
For i = 1 To N: Cells(i1 + i - 1, j1 + i - 1) = 1: Next i ' на главную диагональ.
Next ' Конец цикла по выделенным областям
End Sub
Макрос, используемый на этапе b алгоритма:
Sub Lk() ' запускается по Ctrl+Shift+L и нормирует главный столбец
Dim TR As Range: Dim n As Integer
For Each TR In Selection.Areas ' Цикл по выделенным областям.
n = TR.Count: i1 = TR.Row: j1 = TR.Column ' опр. числа эл-тов и индексов
For i = i1 + 1 To i1 + n - 1
Cells(i, j1) = - Cells(i, j1) / Cells(i1, j1)
Next i
Cells(i1, j1) = 1
Next
End Sub
Макрос для этапа d алгоритма:
Sub TrSolve( ) ' запускается по Ctrl+Shift+x и решает СЛАУ
Dim n As Integer ' с верхней треугольной матрицей
Dim TR As Range ' в выделенной прямоугольной области.
For Each TR In Selection.Areas ' Цикл по выделенным областям.
in = TR.Row: jn = TR.Column ' строка и столбец начала матрицы
n = TR.Rows.Count ' число строк матрицы
If n + 1 <> TR.Columns.Count Then
13
MsgBox "Выделена не подходящий диапазон", , "TrSolve": Exit Sub
End If
Dim b( ) As Double: ReDim b(n)
For i = 1 To n: b(i) = TR.Cells(i, n + 1): Next 'готовим массив b правых чаcтей
For k = n To 1 Step - 1
Cells(in + n, jn + k - 1) = b(k) / TR.Cells(k, k) ' вычисление и запись Xk
For i = 1 To n – 1 ' цикл подстановки в уравнения вычисленного Xk
b(i) = b(i) - TR.Cells(i, k) * Cells(in + k - 1, jn + n + 1)
Next i
Next k
Next
End Sub
Описание решения на Excel задачи A
При решении задачи A (на этапе 1 ) расширенную матрицу Ab1 поме-
щаем в диапазон G2:J4 (см. таблицу 1.1). Таблица 1.1
A B C D E F G H I J
1 Матрица перестановок (шаг k=1)2 Расширенная матрица СЛАУ 1
2 0 1 0 2 1 1 7
3 P1= 1 0 0 Ab1= 4 3 0 10
4 0 0 1 -2 2 3 11
5 Матрица исключений (шаг k=1) 4 Строки переставлены (шаг k=1) 3
6 1 0 0 4 3 0 10
7 L1= -0,5 1 0 P1*Ab1= 2 1 1 7
8 0,5 0 1 -2 2 3 11
9 Матрица перестановок (шаг k=2)
6 Ма Матрица СЛАУ после шага k=1 5
10 1 0 0 4 3 0 10
11 P2= 0 0 1 Ab2=L1*(P1*Ab1)= 0 -0,5 1 2
12 0 1 0 0 3,5 3 16
13 Матрица исключений (шаг k=2) 8 Строки переставлены шаг k=2 7
14 1 0 0 4 3 0 10
15 L2= 0 1 0 P2*Ab2= 0 3,5 3 16
16 0 0,14286 1 0 -0,5 1 2
17 Матрица СЛАУ после шага k=2 9
18 4 3 0 10
19 Ab3=L2*(P2*Ab2)= 0 3,5 3 16
20 0 0 1,4286 4,2857
21 10 Решение СЛАУ с верхней треугольной матрицей x1,x2, x3= 1 2 3
В 1-ом столбце Ab1 главный элемент равен 4, он находится во 2-ой
строке. В соответствии с этим, (на этапе 2 ) слева в ячейках B2:D4 на-

14
биваем (или переделываем из единичной) матрицу перестановок P1, ко-
торая будет задавать перестановки 1-ой и 2-ой строк. Под матрицей
Ab1 (в диапазоне G6:J8) разместим (на этапе 3 ) матрицу, которая по-
лучится как результат умножения P1 на Ab1.
Напомним, как выполняется в Excel умножение матриц. Для этого:
выделяем G6:J8, нажимаем F2, в ячейку G6 вставляем как формулу
функцию МУМНОЖ. Вызвав эту функцию, указываем сначала диапазон
B2:D4 первой матрицы, а затем – второй G2:J4. Для записи матрицы ре-
зультата в диапазон, начинающийся в ячейке G6, следует нажать
Ctrl+Shift+Enter.
После получения матрицы P1*Ab1 с переставленными 2-ой и 1-ой
строками готовим (на этапе 4 ) слева матрицу L1 для исключения неиз-
вестных из строк со 2-ой по 3-ью (c k+1 по n) первого столбца. Для
этого выделяем диапазон B6:D8 (строк c k по n) и запускаем макрос E
создания единичной матрицы (по Ctrl+Shift+E или кликнув по кружку E -
фигуры, с которой мы связали этот макрос). Затем выделяем в матрице
P1*Ab1 1-ый столбец (G6:G8) с главным элементом. Копируем значе-
ния из G6:G8 и, выделив B6:B8, помещаем специальной вставкой (зна-
чения) в столбец единичной матрицы. Не сбрасывая выделение B6:B8,
запускаем (по Ctrl+Shift+L или кликнув по L-кружку фигуры) макрос Lk
нормирования этого вектора. В результате получим показанную в таб-
лице 1.1 (для этапа 4 ) матрицу L1. После умножения (на этапе 5 ) этой
матрицы на расширенную матрицу P1*Ab1 (диапазон G6:J8) заносим в
G10:J12 матрицу произведения Ab2=L1*(P1*Ab1) с исключенным неиз-
вестным x1 из G11:G12.
Аналогичным образом действуем дальше (на этапах 6 , 7 , 8 , 9 ) до
получения матрицы Ab3 (G18:J20), у которой все элементы под главной
диагональю (левой (3х3)-подматрицы Ab3) равны нулю. Расширенная
матрица Ab3 соответствует СЛАУ с верхней треугольной матрицей; она
просто решается последовательным вычислением x1 , x2 , x3 - обратной
подстановкой. Еѐ алгоритм реализован в макросе TrSolve, который за-
пускается по Ctrl+Shift+x (или кликнув по соответствующему x-кружку
фигуры) при предварительно выделенной расширенной матрице
(G18:J20) и выводит (на этапе 10 ) вычисленные неизвестные x1 , x2 , x3

15
системы в ячейки G21:I21 под соответствующими столбцами верхней
треугольной матрицы Ab3.

1.3. Применение в Excel процедуры метода Гаусса


Задача В. Используя обращение к стандартной процедуре решения
СЛАУ методом Гаусса, составить в Excel «функцию, определѐнную
пользователем» для решения СЛАУ.
Замечание. В Excel есть функция МОБР для обращения матриц, с по-
мощью которой решают СЛАУ, по схеме:
Ax  b  x  A1b
Например, матрица A (см. рис. 1.1) записана в ячейки диапазона A1:C3,
а для моделиро- A B C D E
вания реальных 1 100000 200000 300000 700000 733184
вычислений по- 2 400000 500000 600000 1000000 1044480
следний еѐ ко- 3
700000 800000 900000 1100000 1155072
эффициент
4 -4,908E+13 9,817E+13 -4,908E+13 3,534E+15
900000 в ячейке
С3 задан с отно- Рис. 1.1.
сительной погрешностью 5×10-15 представления чисел в машине. Опре-
делитель матрицы A, вычисленный с помощью функции МОПРЕД, ра-
вен -122,236. Вычисленные через обратную матрицу A1 и столбец b
правых частей (D1:D3) неизвестные x1, x2, x3, помещены в ячейки
A4:C4 под соответствующие столбцы матрицы A.
Встречаются руководства, в которых для «проверки» полученные не-
известные умножают на матрицу A, ожидая получить вектор b.
В нашем случае после умножения этот вектор (он записан в ячейках
E1:E3) с инженерной погрешностью (до 4%) совпадает с исходным. Но
оказывается, мы «решили» систему, которая не имеет решения – реши-
ли «без проблем» и не почувствовали этого. То есть процедура МОПР
не выявляет особенных матриц и спокойно вычисляет обратные матри-
цы и в случаях, когда этих матриц не существует. Такие случаи воз-
можны, когда СЛАУ составлена не верно, и какие-либо еѐ уравнения
является линейной комбинацией других уравнений системы.
16
Кроме того методически не правильно применять для решения СЛАУ
более трудоѐмкую процедуру обращения матриц (вычисление A1 из
AA1  E равносильно решению стольких СЛАУ, сколько имеется не-
известных). Поэтому целесообразно пополнить арсенал функций Excel
процедурой эффективного решения СЛАУ с оценкой близости системы
к вырожденной – с оценкой числа обусловленности.
Решение задачи В. Рассмотренный алгоритм решения СЛАУ методом
Гаусса удобно записать на Фортране – языке, хорошо подходящем для
записи алгоритма. Упрощѐнный (без оценки числа обусловленности),
но более наглядный, вариант процедуры представлен ниже:
Subroutine KGAUSS(Ab, N, X, IAI)
Real(8) Ab(N,N+1), X(N) ! Описание массивов
IAI=1
Do k=1, N ! <==> For k=1 To N ! Перебор строк - шаги прямого хода
Call CMEHA ! Выбор и анализ гл. элемента
If( IAI == 0 ) Return ! <==> Exit Sub ! Выход, если гл. элемент = 0
Do i=k+1, N ! Перебор строк с k+1-ой по N-ую
Ab(i,k) = Ab(i,k)/Ab(k,k)
Ab(i,k+1:N+1) = Ab(i,k+1:N+1) - Ab(i,k)*Ab(k,k+1:N+1)
End Do
End Do ! <==> Next k
Do k = N, 1,-1 ! Обратная подстановка (обратный ход)
X(k)=Ab(k,N+1)/Ab(k,k)
Ab(1:N-1,N+1) = Ab(1:N-1,N+1) - Ab(1:N-1,k)*X(k)
End Do
Contains ! ------- Внутренние подпрограммы: ----------------------------------------
Subroutine CMEHA ! Процедура выбора гл. элемента и перестановки строк
Real(8) W(N+1) ; Integer L(1) ! Описание массивов
L=MaxLoc(abs(Ab(K:N,K))) ! Опр. номера строки с гл. элементом
W=Ab(K,:); Ab(K,:)=Ab(L(1)+K-1,:); Ab(L(1)+K-1,:)=W ! Перестановки
If(abs(Ab(K,K) )== 0D0) IAI=0 ! IAI - признак вырожденности системы
End Subroutine
End
Замечание. В Фортране примечания записываются справа от знака «!».
Цикл Do – End Do Фортрана соответствует циклу For – Next Бейсика.
Запись A(i, j1:j2) указывает на элементы с j1-го по j2-ой в i-ой строке, а
запись A(i, : ) - на все элементы i-ой строки матрицы A.

17
Дополнив процедуру KGAUSS оценкой числа обусловленности, от-
транслировав и включив дополненную процедуру KFGAUSS (Карл
Фридрих Гаусс) в библиотеку (названную нами Math32.dll) динамиче-
ского вызова, получим возможность обращаться к ней из VBA. Однако
при этом следует учесть ряд особенностей. Во-первых, необходимо в
VBA декларировать подключаемую процедуру, записав:
Declare Sub KFGAUSS Lib "С:\Путь\Math32.dll" (ByRef Ab As Double, _
ByVal N As Long, ByRef X As Double, ByRef CD As Double)
Во-вторых, следует учесть, что в процедуру надо передавать адрес на-
чала массивов, а не весь массив, включая границы индексов, как это де-
лается в Бейсике. То есть обращение из VBA к процедуре KFGAUSS
может иметь вид:
Call KFGAUSS(AiB(1, 1), N, X(1), CD)
Отметим ещѐ одну особенность реализации процедуры KFGAUSS, по-
зволяющую вычислять определитель левой квадратной (N×N)-части
расширенной матрицы AiB. Этот определитель вычисляется как произ-
ведение диагональных элементов матрицы, а знак произведения, кото-
рый зависит от чѐтного или нечѐтного числа выполненных перестано-
вок, кодируется знаком переменной CD, то есть определитель
det(A)= Aib(1,1)×…×AiB(N,N)×знак(CD).
Число обусловленности матрицы системы положительное и равно аб-
солютной величине |CD|. Если |CD| порядка десятков (не больше 1000),
то система достаточно хорошо обусловлена, и точность еѐ решения вы-
сокая. Большая величина |CD|, скажем, 1012, говорит о близости систе-
мы к вырожденной, |CD|=1E32 указывает на точную вырожденность
системы. Отметим, что для представленной на рис. 1.1 СЛАУ число
обусловленности равно 3,534×1015. Оно получено в ячейке D4 с помо-
щью разбираемой ниже функции пользователя для решения СЛАУ и
указывает на близость рассмотренной системы к вырожденной.
С учѐтом сделанных замечаний в Excel функция, определённая поль-
зователем, для решения СЛАУ и выдачи числа обусловленности мат-
рицы системы, может иметь следующий вид:

18
Public Function xCdGauss(Ab As Range) As Variant
Dim N As Long, CD As Double
N = Ab.Rows.Count
ReDim AiB(1 To N, 1 To N + 1) As Double
ReDim X(1 To N + 1) As Double
For i = 1 To N
For j = 1 To N + 1
AiB(i, j) = Ab(i, j)
Next j
Next i
Call KFGAUSS(AiB(1, 1), N, X(1), CD)
Рис. 1.2.
X(N + 1) = Abs(CD)
A B C D
xCdGauss = X 1 2 1 1 7
End Function 2 4 3 0 10
Функция используется следующим 3 -2 2 3 11
4 1 2 3 13,52941
образом. Для решения СЛАУ с рас-
Рис. 1.3.
ширенной матрицей A1:D3 коэффи-
циентов, например, показанной на рис. 1.3, выделяется горизонтальный
диапазон, например, A4:D4 из N+1 ячеек (N=3 – число уравнений). За-
тем нажимают клавишу F2 и выбирают в ленте: Формулы, Вставить
функцию, Категория - Определѐнные пользователем, xCdGauss, OK. В
возникшем окне Аргументы функции (см. рис. 1.2) указывают для ар-
гумента Ab диапазон A1:D3 ячеек с коэффициентами расширенной
матрицы СЛАУ, а затем нажимают Ctrl+Shift+Enter. В ячейках A4:C4
появятся вычисленные значения неизвестных СЛАУ, а в ячейке D4
число обусловленности матрицы системы.

Подготовка на листе матриц с вычисляемыми коэффициентами


Часто в математических расчѐтах встречаются СЛАУ, коэффициенты
которых могут быть вычислены по сравнительно простым формулам.
Как правило, эти СЛАУ имеют большое число уравнений. При необхо-
димости размещения коэффициентов таких систем в ячейках листа
Excel целесообразно подготовить формулу, задающую коэффициенты,

19
и использовать вместе с ней заранее составленную (стандартную) про-
цедуру, заполняющую числами ячейки прямоугольного диапазона.
Идею организации подобного заполнения рассмотрим на следующем
простом примере
Пример 1.9. Подготовить в выделяемом квадратном диапазоне единич-
ную матрицу E.
Решение примера начнѐм с присвоения имѐн i, j, f соответственно
ячейкам I1, J1, F1 рабочего листа. Переменными i и j будем обозначать
соответственно строки и столбцы выделенного диапазона, а в ячейку с
именем f запишем формулу =ЕСЛИ(i=j; 1; 0) . В процедуре, запол-
няющей выделяемый диапазон, будем ссылаться на поименованные
ячейки:
Sub PutKoeff()
Dim R As Range
Set R = Application.InputBox(prompt:="Укажите матрицу", Type:=8)
i1 = R.Row: j1 = R.Column
For i = 0 To R.Rows.Count - 1
For j = 0 To R.Columns.Count - 1
Range("i") = i + 1 ' запись в ячейку i номера строки
Range("j") = j + 1 ' запись в ячейку j номера столбца
Cells(i1 + i, j1 + j) = Range("f") ' перезапись в ячейку диапазона значения из f
Next j
Next i
End Sub
Свяжем запуск данного макроса с фигурой (как это упомянуто
вскользь в разделе «Описание решения на Excel задачи A»). Для этого
вставим на лист (или, как это было сделано ранее, на рисунок SmartArt)
какую-либо фигуру, вызвав нажатием правой клавишей мыши контек-
стное меню, назначим макрос данному объекту. После этого макрос за-
пускается щелчком по фигуре, мы выделяем квадратный диапазон яче-
ек, в котором затем формируется единичная матрица.
В следующем примере разбирается более сложный случай.

20
Пример 1.10. Подготовить в выделенном
квадратном диапазоне матрицу A, запол-  n 2 1 0 0  2
   
нить (справа от матрицы) столбец сво-  2 n 2 1 0   2
бодных членов b, решить СЛАУ с подго- A   1 2 n 2 1 b   n
   
товленной расширенной матрицей n=6.  0 1 2 n 2  2
 0 0 1 2 n  2
Решение примера, как и предыдущего,    
начинается с присваивания имѐн i, j, f ячейкам I1, J1, F1, а также
имени n ячейке N1. Однако формула для формирования матрицы дан-
ного примера сложнее. Еѐ приходится записывать с несколькими вло-
женными функциями «ЕСЛИ»:
=ЕСЛИ(i=j; n; ЕСЛИ(ABS(j-i)=1; 2; ЕСЛИ(ABS(j-i)=2; 1; 0)))
или только после математической проработки с одной функцией ЕСЛИ:
=ЕСЛИ(ABS(j-i)>2;0; n+ABS(j-i)*(7-3*n+ABS(j-i)*(n-3))/2)
При сложной структуре формулы еѐ удобнее программировать на
VBA, то есть составить функцию, определѐнную пользователем. Для
этого она снабжается атрибутом Public (общая):
Public Function Func(i, j)
Select Case Abs(j - i)
Case 0
Func = Range("n")
Case 1
Func = 2
Case 2
Func = 1
Case Else
Func = 0
End Select
End Function
А в ячейке f готовится формула =Func(i;j) (набивкой или цепочкой
вызовов: формулы, вставить функцию, определенные пользователем,
Func, OK). После запуска макроса PutKoeff и выделения квадратного
диапазона ячеек в нѐм будет сформирована требуемая матрица A. За-
21
полнение столбца свободных членов трудностей не вызывает. После
формирования расширенной матрицы Ab решаем СЛАУ с помощью ра-

Рис.1.4.
зобранной выше функции, определѐнной пользователем, xCdGauss. Ре-
зультаты представлены на рис. 1.4.
1.4. Задачи
1. Автоматизировать вычисления (в Excel) при
пошаговом LU -разложении симметричных  6 2 1 0
 
матриц с диагональным преобладанием (по  2 6 2 1
A
методу Гаусса без выбора главного элемента). 1 2 6 1
 
U – верхняя треугольная матрица (см. в задаче A),  0 1 2 6
1 1
L  L1 L3 – нижняя треугольная матрица с
единицами на главной диагонали. Проверить для A справедливость
выполненного разложения, т.е. LU  A ? Замечание. Матрица Lk1 по-
лучается из L k сменой знаков элементов вне главной диагонали.
2. Автоматизировать (в Excel)
пошаговое решение СЛАУ  1 0 0  3 2 1  14 
LUx b , где U – верхняя тре-      
L   2 1 0  U   0 2 1 b   33
угольная матрица, L – нижняя  1 2 1  0 0 1  26
треугольная матрица с едини-      
цами на главной диагонали. Проверить подстановкой результат ре-
шения. Указание. Считая, что y  Ux , сначала с помощью макроса
решить систему Ly  b , а затем окончательно найти x , решив систе-
му Ux  y (см. в задаче A). 2 1 0 0   d1 
   
3. Записать макрос для решения методом  1 2 1 0    d2 
 0     x    
Гаусса СЛАУ с трѐхдиагональной матри-    
d 
 0 0 1 2   n
22
цей размером (n n) с преобладающей главной диагональю.
Указание. Перестановку строк не выполнять, действия прямого и
обратного хода выполнять над ненулевыми диагональными элемен-
тами.
4. Записать макрос для решения методом Га-
 a1 c1 0 0  d1 
усса СЛАУ с трѐхдиагональной матрицей  b a c 0    d 
 1 2   2
размером (n n) с преобладающей главной  0     x   
2

   
диагональю. Указание. Перестановку строк  0 0 bn1 an  d 
 n
не выполнять, действия прямого и обратно-
го хода выполнять над одномерными массивами коэффициентов.
5. Записать макрос, который в Excel выполнит по шагам метода Гаусса
вычисление определителя неособенной (n n) -матрицы A. Указание.
Выполняя прямой ход метода Гаусса, при-
вести матрицу к верхнему треугольному ви-  6 2 1 0
 
ду. Затем вычислить определитель по фор-  2 6 2 1 
A  
муле   (1) p  a11  ann , где p – число вы- 1 2 6 1
 
полненных перестановок строк матрицы.  0 1 2 6 
6. Записать макрос, который, используя обра-
щение к библиотечной процедуре решения СЛАУ методом Гаусса,
выполнит вычисление определителя (n n) -матрицы A . Указание.
См. задачу B.
7. Записать макрос, который, используя обращение к библиотечной
процедуре решения СЛАУ методом Гаусса, обеспечит нахождения
неизвестных для расширенной вещественной матрицы, заданной в
выделенной (n  (n 1)) прямоугольной области.
Указание. См. задачу B.
8. Записать макрос, который, используя обращение к библиотечной
процедуре решения СЛАУ методом Гаусса, обеспечит нахождения
неизвестных для расширенной комплексной матрицы, заданной в
выделенной (n  2(n 1)) прямоугольной области. Замечание. Хотя
при использовании процедуры Фортрана достаточно поменять тип
переменных с Real на Complex, в Бейсике, увы, такого сделать нель-
зя. Указание. Для решения в VBA СЛАУ (A  i  B) z  c  i  d с ком-
плексными числами необходимо сформировать систему вида:
23
 A  B  x   c 
      , где x  c  i  d , и решить еѐ как СЛАУ с действи-
 B A  y   d 
тельными числами (см. задачу B).
9. Оформить в виде функции, определѐнной пользователем, макрос
для получения единичной матрицы. Указание: см. «Макрос для эта-
па b алгоритма» метода Гаусса. Диапазон ячеек задавать как аргу-
мент функции.
10. Оформить в виде функции, определѐнной пользователем, макрос
для нормирования вектор-столбца по первому элементу.
Указание: см. «Макрос для этапа b алгоритма» метода Гаусса.
11. Оформить в виде функции, определѐнной пользователем, макрос
для решения СЛАУ с верхней треугольной матрицей. Указание: см.
«Макрос для этапа d алгоритма» метода Гаусса.
12. Переписать на VBA процедуру KGAUSS из раздела 1.3. Протести-
ровать процедуру на рассмотренных примерах СЛАУ. Сравнить
число строк VBA-процедуры и процедуры из раздела 1.3.
13. Подготовить в выделенном квадратном диапазоне матрицу A, за-
полнить (справа от матрицы) столбец свободных членов b, решить
СЛАУ с подготовленной расширенной матрицей:
i) как в задаче A - по шагам, принимая на каждом шаге решение о
необходимости перестановки строк, ii) вызвав функции xCdGauss.
а)  6 0 2 1 0 1
б) 6 2 0 0 1 1
       
 0 6 0 2 1  2 2 6 2 0 1  2

A  2 0 6 0 2 b   3
 A  0 2 6 2 1 b   3

       
 1  2 0 6 0  2 0 0 2 6 2  2
 0 1  2  1 1  1
 0 6    1 1 2 6  
в) г)
6 0 2 0 1 0  2 6 2 1 0 0 0 1
       
0 6 0 2 0 1 1 2 6 2 1 0 0  2
2 0 6 0 2 0 1 0 2 6 2 1 0   2
A  b  A  b 
0 2 0 6 0 2 1 0 0 2 6 2 1  2
1  1 0 0 0 2 6 2   2
 0 2 0 6 0     
0   2 1 6  1
 1 0 2 0 6    1 1 1 2  

24
1.5. Решение переопределѐнной системы n линейных
уравнений с m неизвестными (n > m)

Задача С. Дана переопределѐнная система n линей-  


  Fc  y 
ных уравнений Fc  y с m (n  m) неизвестными
(см. рис. 1.4). Решить еѐ, т.е. найти такие c0 , c1 , 1 с0  0  с1  0

чтобы несоответствия между правой и левой частя- 1 с0  1 с1  0
ми уравнений было наименьшим (вектор 1 с  2  с  1
    0 1
Δ  Fc  y невязок имел минимальную длину). Рис. 1.4.

 
Метод решения (метод наименьших квадратов). Уравнения F  c  y (на-
зываемые уравнениями наблюдений) можно записать в виде

1 1 0 1  0  0
1  с      
 2   1   0  
1  c1   1   c2   0   F1  c1  F2  c2  y ,
с
1 3  2  1 1

 2
 
1
 
где F j означает вектор - j-столбец матрицы
(т.е. первый индекс «  » пробегает все значе-
ния номеров строк). Изобразим на рис. 1.5
координатную систему, по осям которой бу-
дем откладывать каждую из трех координат
векторов-столбцов.
 
Векторы v  Fc  F1  c1  F2  c2 при различ-
ных c1, c2 лежат в плоскости  , определяе-
  
мой векторами F1 , F2 . Вектор Δ  Fc  y -
Рис. 1.5. 
это вектор, соединяющий концы векторов y
    
и v (вспомним правила сложения векторов Δ  y  v ). При каком v

(каких c1 ,c2 ) длина вектора Δ наименьшая? Очевидно, что кратчай-

шим расстоянием от конца вектора y до плоскости  будет перпенди-

куляр, опущенный из этой точки на плоскость. Вектор Δ* , совпадаю-
щий с этим перпендикуляром, будет наименьшим, и ему соответствует
25
 
вектор v* , который совпадет с проекцией вектора y на плоскость 

(см. рис. 1.5). Естественно, что лежащий в плоскости  , вектор v*

перпендикулярен вектору Δ* . Условие перпендикулярности векторов
 
v и Δ запишем, приравняв нулю их скалярное произведение (т.к.
v  Δ  cos( 900 )  0 ):
          
vT Δ  (Fc) T (Fc  y)  (c T FT )(Fc  y)  c T (FT Fc  FT y)  0 .

Изначально c  0 , а должен определяться по точкам данных, поэтому
  T  
FT Fc  FT y  0  F Fc  FT y ,

а вектор c* , доставляющий минимум вектору невязок, должен опреде-
ляться решением нормальной системы уравнений
   
Ac  b , где A  F F , а b  FT y .
T

Решение задачи C. Разместим коэффициенты системы с рис. 1.4 в ячей-


ках диапазона B2:D4 (см. рис. 1.7), а коэффициенты нормальной систе-
 
мы Ac  b с расширенной матрицей Ab, будем хранить в ячейках диа-
пазона E2:G3. Для заполнения указанного диапазона (а также элементов
матрицы Ab) можно использовать следующий программный код:

Sub Ab()  
Ac  b 
For i = 1 To 2
For j = 1 To 3 3 3  с1  1
3 5  с   2
S=0    2  
For k = 1+1 To 1+3 ' - строки матр. F с1  0,166667 с2  0,5
S = S + Cells(k, i) * Cells(k, j) Рис. 1.6.
Next k
Cells(i+1, j + 4) = S ' заполнение матр. Ab
Next j
Next i
End Sub

26
Но вместо этого проще воспользоваться стандартными процедурами
Excel. Для этого следует: выделить диапазон ячеек E2:G3, нажать F2,
набить формулу: =МУМНОЖ(ТРАНСП(B2:C4);B2:D4), а затем на-
жать Ctrl+Shift+Enter.
Решение нормальной системы уравнений (см. рис. 1.6) выполним об-
ращением к функции xCdGauss, определѐнной пользователем. Вычис-
ленные коэффициенты с1, с2 занесены в ячейки E4:F4 (см. рис. 1.7).
Замечание. Систему уравнений в решѐнной задаче С удобно трактовать
как условия с1 1  с2  xk  yk проведения прямой с1 1 с2  x  y через точки
xk , yk , k  1,, 3 . Можно изобразить их на точечной диаграмме, а также
рассчитать точки на найденной прямой, добавить их к точечной диа-
грамме и соединить отрезками (подробности построения точечных диа-

Рис. 1.7.

грамм см. в разделе 3). Получится картинка, показанная на рис. 1.7, где
прямая сглаживает точки, полученные в результате эксперимента и со-
держащие случайные погрешности замеров.
Множители при коэффициентах в с1 1  с2  xk  yk можно рассматри-
вать как базисные функции f1(x)  1, f 2 (x)  x приближающей кривой

27
f (x)  c1  f1(x)  c2  f2 (x) , а элементы в k  ой строке матрицы F как
значения этих базисных функций при аргументах xk .
Отметим, что при решении ячейкам E4, F4 присвоены соответственно
имена с1 и с2 (с русскими буквами «с»). Эти имена использованы в
формуле, записанной в ячейке C6, для расчѐта ординат линейной функ-
ции f (x) .

1.6. Задачи
1. Заданы массивы точек xk , yk , k  1,2,, n, (n  2) . Записать условия про-
хождения приближающей их кривой y(x)  f1(x)  c1  f2 (x)  c2 через
заданные точки в виде системы n линейных относительно коэффици-
T 
ентов c  с1 с2  уравнений и решить эту систему (вычислить c ) так,
чтобы вектор несоответствия (невязок) между правой и левой частями
этого уравнения был минимальным. Показать на графике заданные точ-

ки и кривую. Указание. Коэффициенты c приближающей кривой най-
 T
ти, решив систему F Fc  F y ; координаты точек данных приведены
T

в таблице 1, там же даны приближающие функции – они заключены в


рамки.
2. Заданы массивы точек xk , yk , k  1,2,, n, (n  3) . Записать условия
прохождения приближающей их кривой
y( x)  f1(x)  c1  f 2 (x)  c2  f3 (x)  c3 через заданные точки в виде сис-

темы n линейных относительно коэффициентов c  c1 c2 c3 
T

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

Указание. Коэффициенты c приближающей кривой найти, решив сис-
 
тему F Fc  F y ; данные и приближающие функции даны в
T T

таблице 1.1.

28
Варианты заданий
Таблица 1.1
f ( x )  c1x  c2 x2  c3 x3 ; x [0,9] . f ( x )  c1  c2 x  c3 / x ; x [1,9]
вар.1 вар.2 вар.3 вар.4 вар.5 вар.6 вар.7 вар.8 вар.9 вар10
yi yi yi yi yi yi yi yi yi yi
xi xi
1.0 1.0 2.0 0.0 -1.0 -1.0 1.0 2.0 4.0 -1.0 3.0 -1.0
2.0 2.0 3.5 0.0 -1.5 -1.0 2.0 3.5 2.0 1.0 1.0 1.0
3.0 2.0 3.0 1.0 -1.0 0.5 3.0 3.0 2.0 2.0 0.5 2.0
4.0 2.5 3.5 2.5 0.0 0.0 4.0 3.5 1.0 2.0 2.0 1.0
5.0 2.0 3.0 2.0 0.0 1.5 5.0 3.0 1.0 2.5 2.5 1.5
6.0 2.5 2.5 2.0 0.5 2.5 6.0 2.5 0.5 3.0 2.0 1.0
7.0 3.5 2.5 1.0 2.0 2.0 7.0 2.5 1.0 2.5 3.0 0.5
8.0 3.5 1.5 0.0 2.5 1.0 8.0 1.5 0.5 3.0 4.0 0.0
9.0 4.5 1.0 0.5 4.0 0.0 9.0 1.0 0.0 3.0 4.0 0.0

f ( x )  c1  c2 x2  c3 x 4 ; x [0,9] . f ( x )  c1  c2 x  c3 x3 ; x [0,9]
вар11 вар12 вар13 вар14 вар15 вар16 вар17 вар18 вар19 вар20

xi yi yi yi yi yi xi yi yi yi yi yi

1.0 0.0 3.0 4.0 3.0 0.0 1.0 3.0 1.0 2.5 1.0 4.0
2.0 0.0 3.0 4.0 3.0 0.0 2.0 3.0 2.0 3.0 1.0 3.0
3.0 1.0 2.0 3.5 2.0 0.5 3.0 3.0 2.5 3.0 1.5 2.0
4.0 1.5 2.0 3.5 2.0 1.0 4.0 2.5 3.0 2.5 2.0 1.5
5.0 2.0 1.5 3.0 1.0 1.0 5.0 2.0 2.5 2.0 2.0 2.0
6.0 1.5 1.0 3.0 0.5 1.5 6.0 2.0 2.0 2.0 3.0 2.0
7.0 1.5 1.0 2.0 0.5 2.5 7.0 1.0 1.5 1.5 4.0 2.5
8.0 0.5 2.0 1.0 0.0 3.0 8.0 1.0 1.0 1.5 4.5 3.0
9.0 0.0 2.5 1.0 -0.5 3.0 9.0 0.0 0.0 1.0 5.5 3.5

29
f ( x )  c1 x  c2 x 2  c3 / x ; x  [1,9]. f ( x )  c1x  c2 x3  c3 / x ; x [1,9]
вар21 вар22 вар23 вар24 вар25 вар26 вар27 вар28 вар29 вар30

xi yi yi yi yi yi xi yi yi yi yi yi
1.0 4.0 4.0 0.0 0.0 4.0 1.0 4.0 4.0 3.0 1.5 1.0
2.0 3.0 2.5 2.0 1.5 2.5 2.0 2.5 1.5 2.0 2.0 1.0
3.0 2.0 2.0 3.0 1.5 2.0 3.0 2.0 2.0 2.0 2.0 2.0
4.0 1.5 1.5 3.0 2.0 1.5 4.0 2.0 1.0 2.5 3.0 1.5
5.0 2.0 1.0 2.5 2.0 1.5 5.0 2.5 2.0 2.5 3.0 2.0
6.0 2.0 1.0 2.5 2.5 1.0 6.0 2.0 2.0 2.0 3.0 2.5
7.0 2.5 0.5 2.0 3.0 1.0 7.0 2.0 3.0 2.0 1.5 3.5
8.0 3.0 0.0 1.0 4.0 1.5 8.0 1.5 4.0 1.0 1.0 4.0
9.0 3.5 -1.0 0.0 4.5 1.0 9.0 1.0 4.0 0.5 0.0 5.0

30
2. Решение в Excel нелинейного уравнения
2.1. Встроенные и дополнительные средства решения
В Excel имеется средство «Подбор параметра», которым часто поль-
зуются для решения нелинейного уравнения. Рассмотрим следующий
пример.
Пример 2.1. Найти с относительной погрешностью 0,001 корень урав-
нения x3  x2  0.1  0 на отрезке x [0 ; 2] .
Для решения примера поместим в
A B
ячейки A1 и B1 надписи «Аргумент»
и «Функция», присвоим (используя 1 Аргумент Функция
Формулы, Присвоить имя) ячейкам 2 =x^3-x^2-0,1
A2 и B2 соответственно имена «x» и
x Рис. 2.1. f
«f». Введѐм в ячейку B2 формулу
(см. рис. 2.1). Далее можно выбрать: Данные, Анализ «что-если», Под-
бор параметра и искать решение в ручном режиме. Но мы воспользу-
емся следующим макросом и запустим его:
Sub Primer_2_1()
Application.MaxChange = 0.0001 ' «относительная погрешность»
Range("x") = 0. ' назначаем начальное приближение
res = Range("f").GoalSeek(Goal:=0, ChangingCell:=Range("x"))
Debug.Print res, Range("x"), Range("f")
End Sub
В результате в окне отладки получим:
True 1,08491453462296 -5,22345966353088E-05,
т.е. True – корень уравнения найден, он равен x  1,0849145, а «погреш-
ность»  5,22E  05 относится не к корню, а к значению функции при
найденном значении x.
Но если мы зададим лучшее начальное приближение (ближе к ис-
комому корню) Range("x") = 0.65 , то результат окажется таков:
False -14355105132924,3 -2,95814278232263E+39,

31
т.е. корень не найден, подбор параметра не сработал. Не стоит особо
удивляться этому, ведь это средство не предназначено специально для
решения уравнений. Заметим, что если (см. задачу 1 в разделе 2.2) ме-
нять x на интервале (0; 1) с шагом dx=0.1, то при x=0.7, …,1.0 подбор
параметра сработает, и корень будет найден.
Существуют надѐжные методы численного решения нелинейного
уравнения f ( x)  0 , один простой метод из их числа - метод деления
отрезка пополам. Его идея состоит в том, что отрезок, на концах кото-
рого непрерывная функция имеет противоположные знаки, делится по-
полам, а затем выбирается для дальнейшего поиска та его половина, на
концах которой знаки функции различные. Процесс деления продол-
жается до тех пор, пока отрезок [ ,  ] , содержащий корень, не станет
достаточно малым. Представим алгоритм данного метода на VBA в ви-
де функции:
Function DOP(Fch As String, Xch As String, a As Double, _
b As Double, Optional Eps As Double = 0.0001, Optional Iter As _
Integer) As Boolean
' Fch, Xch - имена ячеек с функцией и аргументом,
' a, b - левая и правая границы отрезка, содержащего корень,
' Eps - относительная погрешность корня |X* - X|/max(|a|,|b|)<Eps,
' Iter - число выполненных приближений.
Dim Alpha As Double, Beta As Double, Sfa As Integer
Dim X As Double, D As Double, Mabs As Double
'++++++++++++++++++++++++++++++++++++++++++++++++
Range(Xch) = a
Sfa = Sgn(Range(Fch))
Range(Xch) = b
Bisec = False
If Sfa * Sgn(Range(Fch)) > 0 Then Exit Function
Mabs = IIf(Abs(a) > Abs(b), Abs(a), Abs(b))
If Eps < 0.000000000000005 Then Eps = 0.000000000000005
Alpha = a: Beta = b
Iter = 0

32
Do: Iter = Iter + 1
D = 0.5 * (Beta - Alpha)
X = Alpha + D: Range(Xch) = X
If D / Mabs <= Eps Then Exit Do
Select Case Sgn(Range(Fch)) * Sfa
Case 1: Alpha = X ' f(X)*Sfa > 0
Case 0: Exit Do ' f(X) = 0
Case -1: Beta = X ' f(X)*Sfa < 0
End Select
Loop
DOP = True
End Function

Sub Primer_2_2( ) ' Пример 2.2. Запускающая процедура:


Dim N As Integer
res = DOP(Fch:="f", Xch:="x", a:=0, b:=3, Eps:=0.0001, Iter:=N)
Debug.Print res, Range("x"), Range("f"), N
End Sub
Результат, выведенный в окно отладки:
True 1,08489990234375 -7,21528830126827E-05 14
2.2. Задачи
1. Найти с относительной погрешностью 0,001 корень уравнения
x3  x2  0.1  0 подбором параметра и методом половинного деле-
ния на отрезке x [a ; 2] для a=0; 0.1; …0.7. Сравнить полученные
результаты.
2. Цилиндрическая автоцистерна для перевозки жидкости имеет в сече-
нии форму эллипса с полуосями: a=1м, b=0.75м. Длина L цистерны
составляет 4м. Цистерна установлена горизонтально. Для тарировки
мерного щупа, опускаемого вдоль вертикальной оси эллипса, рассчи-
тать высоту h уровня налитой жидкости для объѐма V через каждые
0.5 м3 объѐма V. Построить график зависимости высоты h уровня от
объѐма V. Указание. Зависимость объѐма V жидкости, налитой в
33
цистерну, от высоты h уровня жидкости выражается формулой:

V(h)  ab    arccosh b 1  a  h b 1 (2b  h)  h  L . Для сравнения 
построить в одних и тех же осях (с одинаковым масштабом единиц)
графики зависимостей h(V), V(h) и h(h).
3. Ёмкость для хранения жидкости имеет форму сферы с радиусом
R=1 м. Для тарировки мерного щупа, опускаемого по малой оси эл-
липсоида, рассчитать высоту h уровня налитой жидкости для объѐма
V через каждые 0.1 м3 объѐма V. Построить график зависимости
высоты h уровня от объѐма V. Указание. Зависимость объѐма V жид-
кости, налитой в ѐмкость, от высоты h уровня жидкости выражается
  h2
формулой: V(h)  3R  h. Для сравнения построить в одних и
3
тех же осях (с одинаковым масштабом единиц) графики зависимо-
стей h(V), V(h) и h(h).
4. Ёмкость для жидкости имеет форму, полученную вращением обра-
зующей r   ln(1  z) [м] вокруг вертикальной оси oz . Высота ѐм-
кости 0,99 м. Для тарировки мерного щупа, опускаемого по оси oz ,
рассчитать высоту h уровня налитой жидкости для объѐма V через
каждые 0.1 м3 объѐма V. Построить график зависимости высоты h
уровня от объѐма V. Указание. Зависимость объѐма V жидкости, на-
литой в ѐмкость, от высоты h уровня жидкости выражается форму-
лой: V(h)    (1 z)  ln(1 z)  z. Для сравнения построить в одних и
тех же осях (с одинаковым масштабом единиц) графики зависимо-
стей h(V), V(h) и h(h).
5. Рассчитать зависимость от температуры T [300 o K; 400 o K]
тока I , проходящего через диод, при прямом включении источника
ЭДС E  1 в . Принять, что диод моделируется последовательно со-
единѐнными резистором (выражающим объѐмное сопротивление RS )
и управляемым источником тока I (V ) , для которого
V  T  Eg XTI
 1
VT (T )N  Tnom  VT (T )N  T  N
I (V ,T )  Is(T )  (e 1) , а Is(T )  IS  e   ,
 Tnom 
где RS  1 ом , VT(T )  8.614105  T в , N  1.4 , Tnom  300 o К , IS  1014 А ,

34
Eg  1.11 эв , XTI  3 .
Указание. Напряжение на источнике тока равно: V  E  RS  I (V , T ) .
6. Асинхронный мотор вращает колесо воздуходувки. Рассчитать зави-
симость числа оборотов n и величину скольжения s ротора мотора
от относительной величины   R R ротора подключенного к ротору
добавочного сопротивления R , если известны: зависимость крутя-
5 2
щего момента Mк (н·м) колеса от n (об/мин) Mк  2 10 n  0.2 ;
зависимость крутящего момента Mк (н·м) мотора от  и величины
скольжения s  n0  n n ( n0 - синхронное число оборотов ротора):
 s sm  1    
M к  200    , n0  1000 об / мин , sm  0.1 .
 sm  1    s 
7. Рассчитать зависимость максимальной скорости v движения авто-
мобиля на прямой передаче с двигателем внутреннего сгорания от
угла  подъѐма участка трассы с параметром сопротивления
   0  cos  sin  . Удельную тягу автомобиля принять равной
T v  3  v 10  v 10  1 н / кг . Силу сопротивления движению вычис-
лять по формуле F    cos   sin    m  g  c  S    v / 2 . В расчетах при-
2

нять: масса автомобиля m  2000 кг , ускорение свободного падения


g  9.81 м / сек2 , коэффициенты сопротивления  0  0.08, с  0.1 ,
площадь поперечного сечения автомобиля S  1.96 м2 , плотность
воздуха   1.24 кг / м . Расчѐт выполнить для  [0o ; 18o ] , а изме-
3

нение скорости ограничить диапазоном v 50 / 3.6 м / сек; 115/ 3.6 м / сек.
8. Решить задачу 5 для автомобиля с двигателем, удельная тяга
которого (на прямой передаче) изменяется по закону
T v  3  v 10  0.2  v 103 н / кг .

35
3. Представление данных в виде графиков и диаграмм
3.1. Построение графиков
Построение в Excel графика функции Y  Y(X) по значениям Yi в
равноотстоящих точках Xi [a, b] отрезка [a, b] изменения аргумента
выполняется следующим образом: выделяют столбец значений Yi , а за-
тем используют цепочку вызовов Вставка, Диаграммы, График. При
этом график будет построен не на шкале аргумента X , а на шкале ин-
дексов (номеров точек). Чтобы придать этой шкале вид оси аргумента
X , меняют подпись горизонтальной оси, подставляя в еѐ диапазон чис-
ла из столбца X . Полученная картинка будет соответствовать графику
Y  Y(X) для однозначной функции при равноотстоящих значениях Xi .
В общем случае, когда график строится по массивам точек Xi и Yi ,
следует использовать точеные диаграммы. Рассмотрим их применение
при решении следующей задачи.
Пример 3.1. Построить график функции Y  F(X), заданной формулой
«=X/КОРЕНЬ(1 + X ^ 2)» в ячейке B2. Для запоминания значений аргумен-
та X, изменяющегося от -2 до +2 с шагом 0,1 , использовать ячейку A2.
Решение примера 3.1 начнѐм с оформления ячеек на рабочем листе:
введѐм в ячейки A1 и B1 соответственно символы X и F, а ячейкам A2 и
B2 присвоим имена X и F (выбрав предварительно Формулы на ленте).
Введѐм формулу в ячейку B2. Оформим вычисление значений аргумен-
тов и функции в виде следующего макроса:
Sub PutXF()
Const N As Integer = 40 ' Число подинтервалов на [a; b]=[-2; 2].
H = (2 - (-2)) / N ' Шаг по аргументу X.
For i = 0 To N ' Начало цикла по точкам графика.
X = -2 + H * i ' Значение аргумента X
Range("X") = X ' переслать в ячейку A2 для вычисления F(X) в B2
Cells(i + 3, 1) = X ' и переслать в ячейку i+3 строки столбца A.
Cells(i + 3, 2) = Cells(2, 2) ' Скопировать значение F(X) в
' ячейку строки i+3 столбца B.
Next i ' Конец цикла по точкам графика.

36
End Sub
После исполнения макроса выделим заполненный числами диапазон
A3:B43 и выполним цепочку Вставка, Диаграммы, Точечная (с гладки-
ми кривыми) – на диаграмме должен появиться график (см. рис. 3.1).

Рис. 3.1.

3.2. Изображение плоских параметрических кривых


Точечные диаграммы (ТД) идеально подходят для изображения пло-
ских параметрических кривых – кривых, X(t), Y(t) -координаты которых
зависят от значения параметра t . Кривые r  r() , заданные в полярных
координатах, также могут рассматриваться как параметрические (с па-
раметром  ), если принять, что X  r()  cos(), Y  r()  sin() . Рассмот-
рим построение таких кривых на следующем примере.
Пример 3.2. Изобразить на точечной диаграмме Excel полярные кри-
вые r  20  a  cos   sin  ,  [0, 2 ],    / 36 , при каждом из зна-
2 2

чений параметра a  60, 40, 20, 0 .


Решение примера 3.2. Вычисление Xi , Yi -координат кривых выполним
в макросе, и разместим координаты в столбцах A и B таблицы Excel, а
значение параметра a будем выводить в столбец C в строку со значе-
ниями координат первой точки каждой кривой. Учтѐм особенность по-
строения гладкий кривых (см. рис. 3.2) - координаты каждой после-
дующей кривой (новой кривой, строящейся независимо от предыду-
щей) отделяются пустой строкой от координат предыдущей кривой.

37
Sub Rose() ' Решение примера 3.2.
Const N As Long = 36 ' Число точек на кривой.
Const pi As Single = 3.1415927
i=1 ' Номер строки для выводимых координат.
For a = 60 To 0 Step -20 ' Цикл по параметру a
Cells(i, 3) = a ' Запись в ячейку Excel значения параметра.
For fi = 0 To 2 * pi + pi / N / 2 Step pi / N ' Цикл по углу fi
r = Abs(20 + a * Abs(Cos(fi) ^ 2 - Sin(fi) ^ 2))
x = r * Cos(fi): Cells(i, 1) = x ' Запись в ячейки Excel
y = r * Sin(fi): Cells(i, 2) = y ' x и y – координат.
i=i+1 ' Номер следующей строки для вывода координат.
Next fi
i=i+1 ' Для пропуска строки после вывода координат кривой
Next a
Call GR("A1:B" & i - 2) ' Обращение к процедуре построения ТД
End Sub ' с передачей в неѐ диапазона ячеек "A1:B295".
Sub GR(rng As String) ' Построение Точечной Диаграммы (ТД).
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range(rng)
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ' Тип ТД.
ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Range(rng)
End Sub

38
Рис. 3.2. Результат решения примера 3.2
3.3. Задачи

Варианты 1–10. Рассчитать x,y-координаты точек кривых (заданных в


параметрической форме) для параметра t, изменяющегося на отрезке
[tнач; t кон] с шагом t, при каждом из указанных значений a.
Таблица 3.1
№ Параметрическая кривая Значения аргумента Значение a
tнач ; tкон ;  t
1 x(t )  a cos(t ) 0; 2; /36 30; 40; ... 60
y(t )  (a / 2) sin(t )
2 x(t )  sin( a t ) 0; 2; /72 1; 2; ... 4
y(t )  (1/ 2) sin(4t )
3 x(t )  40(t  a sin(t )) 0; 2; /36 1;0.75; ..0.25
y(t )  40(1  a cos(t ))
4 x(t )  80cos(t ) 0; 2; /36 0; /8; ... /2
y(t )  50sin(t  a)
5 x(t )  40cos(t )  20a cos(2t ) 0; 2; /72 0.5; 1.0; ..2.0
y(t )  40sin(t )  20a sin(2t )
6 x(t )  45cos(t )  15a cos(3t ) 0; 2; /72 0.5; 1.0; ..2.0
y(t )  45sin(t )  15a sin(3t )
7 x(t )  60cos(t )  15a cos(4t ) 0; 2; /72 0; 0.5; ... 2.0
y(t )  60sin(t )  15a sin(4t )
8 x(t )  20a(2  cos(t )) 0; 2; /36 0.5; 1.0; ..3.0
y(t )  20a sin(t )
9 x(t )  (120  20a) cos(t )  20a 0; 2; /36 0; 1; ... 4
2
y(t )  (120  20a) sin(t )
3
10 x(t )  (4  a) t  (12  3a) t 2  0; 1; 0.02 0; 7.5; ... 30
 (2a  8) t 3
y(t )  (4  a)(1  t ) t

39
Варианты 11–20. Рассчитать координаты точек кривых (заданных в
полярных координатах) для полярного угла , изменяющегося на от-
резке [нач;кон] с шагом , при каждом из указанных значений a.
Таблица 3.2
№ Кривая в полярных Значения аргумента Значение a
координатах нач ; кон ; 
11 r  a 0; 2; /36 5; 7.5; ... 15
12 r  30cos  a 0; 2; /36 10; 25; ... 70
13 r  a 2 cos2 –/4; /4; /36 80; 70; ... 50
14 r  a sin 2 0; 2; /36 50; 60; ... 80
15 r  a  20 | cos2   sin 2  | 0; 2; /36 0; 20; ... 60

16 r  a sin 3 0; ; /36 80; 70; ... 50


17 r  20  a | cos2   sin 2  | 0; 2; /36 60; 40; ... 0

18 r  a / cos4   sin 4  0; 2; /36 20; 40; ... 80


19 r  a / 4 cos4   sin 4  0; 2; /36 80; 60; ... 20
20 r  a(cos  1) 0; 2; /36 20; 40; ... 80

Контрольные значения, вычисленные при 2-ом значении аргу-


мента и 1-ом значении параметра a.
Таблица 3.3
№ X* Y* № X* Y*
1 .298858E+02 .130734E+01 11 .434672E+00 .380289E–01
2 .436194E–01 .868241E–01 12 .397341E+02 .347628E+01
3 .442879E–02 .152212E+00 13 .361155E+02 –.303045E+02
4 .796956E+02 .435779E+01 14 .864937E+01 .756722E+00
5 .499239E+02 .873218E+00 15 .196212E+02 .171663E+01
6 .523930E+02 .983926E+00 16 .206267E+02 .180461E+01
7 .599429E+02 .261716E+01 17 .787875E+02 .689301E+01
8 .299619E+02 .871557E+00 18 .200758E+02 .175641E+01
9 .119543E+03 .697246E+01 19 .799988E+02 .699899E+01
10 .847360E–01 .784000E–01 20 .397720E+02 .347960E+01
40
1. Записать макрос, который по заданным соответственно в ячейках
A2, B2 и D2 значениям a, b и, набитой по правилам Excel, функции
f (x) (C2 - ячейка с аргументом x ) строит график этой функции
на отрезке a  x  b . Указание. График строить по N+1=101 точке
(N задать в макросе константой).
2. Записать макрос, который по заданным в ячейках A2, B2, C2 значе-
ниям соответственно ax, bx, Nx для аргумента x (его значения со-
храняются в ячейке D2) и заданным в ячейках A4, B4 , C4 значениям
соответственно ap, bp, Np для параметра p (его значения сохраняют-
ся в ячейке D4) строит Np графиков y(x) (формула задаѐтся в ячейке
E5) в декартовых координатах. Причѐм для каждого графика аргу-
мент x рассчитывается в Nx+1 точке отрезка ax  x  bx .
3. Записать макрос, который по заданным соответственно в ячейках
A2, B2 и D2, E2 значениям a, b и, набитым по правилам Excel, функ-
циям x(t ), y(t ) (C2 - ячейка с аргументом t ) строит график пара-
метрической кривой y( x(t )) на отрезке a  t  b . Указание. График
строить на точной диаграмме в виде гладкой кривой по 101 точке.
4. Записать макрос, который по заданным в ячейках A2, B2 , C2 значе-
ниям соответственно at, bt, Nt для аргумента t (его значения сохра-
няются в ячейке D2) и заданным в ячейках A4, B4, C4 значениям со-
ответственно ap, bp, Np для параметра p (его значения сохраняются в
ячейке D4) строит Np параметрических кривых y( x(t )) (формулы
x(t ), y(t ) задаются в ячейке E5, F5). Причѐм для каждой кривой ар-
гумент t рассчитывается в Nt+1 точке отрезка at  t  bt . Указание.
Кривые строить на точной диаграмме в виде гладких кривых.
5. Записать макрос, который по заданным соответственно в ячейках
A2, B2 и D2 значениям a, b и, набитой по правилам Excel, функции

() (C2 - ячейка с аргументом  ) строит график кривой () в по-
лярных координатах на отрезке a   b.
Указание. График строить на точной диаграмме в виде гладкой кри-
вой по N+1=101 точке (N задать в макросе константой).
6. Записать макрос, который по заданным в ячейках A2, B2 , C2 значе-
ниям соответственно af, bf, Nf для аргумента f (его значения сохра-
41
няются в ячейке D2) и заданным в ячейках A4, B4 , C4 значениям
соответственно ap, bp, Np для параметра p (его значения сохраняют-

ся в ячейке D4) строит Np кривых  ( f ) (формула задаѐтся в ячейке
E5) в полярных координатах. Причѐм для каждой кривой аргумент f
рассчитывается в Nf+1 точке отрезка af  f  bf . Указание. График
строить на точной диаграмме в виде гладкой кривой.
3.4. Использование сплайн-функций и сплайн-кривых
При построении на точечных диаграммах плавных кривых по неболь-
шому числу точек стандартные
средства Excel могут не дать
подходящего результата. Кроме
того, стандартные гладкие кривые
Excel, приближающие (интерпо-
лирующие) исходные точки дан-
ных, не дают возможности рас-
считать координаты промежу-
точных точек и вычислить по
ним (иногда крайне необходи-
мые) геометрические характери- Рис. 3.3.
стики. В таких случаях полезно
подключить и использовать через VBA нестандартные средства, на-
пример, функции, выполняющие приближение (интерполяцию) кубиче-
скими сплайнами. На рис. 3.3 показаны две кривые, приближающие
(интерполирующие) окружность, по трѐм равномерно расположенным
на ней точкам, также показанным на рис. 3.3. Стандартными средства-
ми не удаѐтся приблизить окружность - получается «треугольник», а
сплайн-кривая при подходящем выборе еѐ параметров даѐт хорошую
«окружность».
Кубическая сплайн-функция S (x) (или кубический сплайн S (x) ) на
сетке узлов x1    xi1  xi    xn - непрерывная кусочная функция, за-
даваемая на интервалах [ xi1, xi ] между узлами кубическими полинома-
ми si ( x)  a0i  a1i x  a2i x2  a3i x3 , которые гладко (с совпадением первой и
вторых производных) стыкуются друг с другом в узловых точках. Такие
сплайны имеет разрывы третьей производной (сплайны дефекта 1 =3-2).
42
Сплайн-функции получили своѐ название от гибких деревянных или
металлических реек, которые использовались чертѐжниками при прове-
дении плавных линий через заданные точки при разработке (на плазе)
чертежей обводов судов или автомобильных кузовов. Существуют раз-
личны формы записи сплайн-функций. Впервые запись сплайнов в виде
x2 x3 ( x  x1 ) 3 ( x  x2 ) 3
EJ  y( x)  С2  С1  x  M a Va   P | Vb |
2 6 x x2 6 x x3 6
как уравнение упругой линии нагру-
женной балки (рис. 3.4.) предложена
профессором И.Г. Бубновым в 1914 г. в
книге «Строительная механика».
Прерыватели И.Г.Бубнова | ука-
x xi

зывают, что следующее за ним выра-


жение добавляется лишь при x  xi , а
Рис. 3.4.
иначе оно равно нулю. При EJ  1 и
большом числе n точек xi приложения сил структура аналитической
зависимости y(x) упругой линии такова:
y(x)  a0  a1  x  a2  x 2  a3  x3  in1 ai2 | (x  xi )3  3i0 ai  xi  in2 ai2 | ( x  xi )3
x xi x xi

Это и есть уравнение сплайна с прерывателями И.Г. Бубнова.


В «современной» записи сплайна И.Г. Бубнова
s( x)  3k 0 ak  x3  nk 1 ak 3 ( x  xk )3
просто обозначают прерыватель | ( x  xi ) как ( x  xk )  с подстроч-
x x1
ным знаком "+", который имеет точно такой же смысл, что и прерыва-
тель: выражение ( x  xi ) действует, когда оно положительно, и не дей-
ствует (равно нулю) при x  xi . Это выражается и по другому
| ( x  xi )  ( x  xi )   max(0, x  xi ) .
x xi

Кубический сплайн однозначно определяется заданием ординат yi в


узловых точках xi и условиями на концах: заданием первых или вторых
43
производных (нулевые вторые производные соответствуют распрямле-
нию линии на концах, как в случае реек чертѐжников). Часто использу-
ется условие «без узла», когда на двух крайних интервалах сплайн вы-
ражается одним полиномом. Это условие даѐт плавное изменение кри-
визны у краѐв сплайна.
При вычислениях значений S (x) вместе с ординатами yi используются,
например, первые производные pi в узловых точках, которые предва-
рительно вычисляются решением СЛАУ с трѐхдиагональной матрицей.
Вычисление недостающих производных pi в узловых точках и расчѐт
ординат v  S (u) сплайна в точках u выполняется обращением к функ-
ции HS, которая вызывается из библиотеки Math32.dll и должна декла-
рироваться в VBA (см. в модуле Math.bas) оператором:
Declare Function HS Lib "C:\Путь\Math32.dll" _
(ByRef u As Double, ByVal n As Long, ByRef X As Double, ByRef Y As Double, _
ByRef p As Double, ByRef Kod As Long, ByRef KodErr As Long) As Double
Обращаются из VBA к функции HS следующим образом:
v = HS(u, n, x(1), y(1), p(1), Kod, KodErr),
где HS, u, x, y, p типа Double; n, Kod, KodErr типа Long (4 байта).
Функция при Kod  0 вычисляет массив p неизвестных производных
pi в узлах, а затем устанавливает Kod в 1 и переходит к следующему
пункту. При Kod  0 узлы сетки сплайна должны строго возрастать.
При Kod>0 функция вычисляет значение v  S (u) сплайна в точке u .
Если при расчете узлы xi1, xi совпадают, то принимают vi  ( yi1  yi ) / 2 .
Значения входных аргументов:
u - абсцисса точки для вычисления ординаты,
n - число узлов сплайна,
x(1), ..., x(n) - абсциссы узлов сплайна,
y(1), ..., y(n) - ординаты узлов сплайна,
p(1), p(n) - производные в граничных узлах сплайна,
Kod - задает способ использования подпрограммы:
Kod={-22, -21, -12, -20, -02, -11, -10, -01, 00, -01, -02,..}

44
Если Kod  0, то первая слева цифра указывает, что на левой границе
( x1 ) заданы: 2 - "без узла", 1 - в p(1) задана 1-ая производная, 0 - ну-
левая 2-ая производная. Вторая слева цифра указывает, что на правой
границе ( xn ) заданы: 2 - "без узла", 1 - в p(N) задана 1-ая производная,
0 - нулевая 2-ая производная.
Если Kod>0, то массив p(1),...,p(N) считается заданным, он не изменя-
ется, а используется для вычисления значения сплайна. Kod при этом
указывает номер обращения к данной функции.
Выходные аргументы:
HS - ордината сплайна в точке u,
Если на входе задано Kod  0, то предварительно вычисляются элементы
массива производных p(2),...,p(N-1) и устанавливается Kod=1. Если же
на входе Kod>0, то при выходе Kod:=Kod+1.
KodErr – код завершения: KodErr = 0 - штатное завершение,
KodErr = №>0 - аварийное завершение, № - код ошибки.
KodErr = 1 - Ошибочное задание сетки узлов (N<2)!
KodErr = 20 - Узлы сетки не упорядочены по возрастанию!
KodErr = 21 - Узлы сетки не упорядочены строго по возрастанию!
KodErr = 3 - Ошибочное задание параметров сплайна!
KodErr = {4 | 5 | 6 | 7} - Ошибочное задание граничных условий!
KodErr = {8 | 9} - Ошибочное задание параметра Kod !
Кубическая сплайн-кривая (на плоскости) представляет собой пара-
метрический сплайн V (t )  X (t ),Y (t ), составленный из двух кубических
сплайнов X (t )  Sx(t ), Y (t )  Sy(t ) , зависящих от параметра t и заданного
на сетке t0  t1    tn , в качестве узла ti которой принята длина лома-
ной (с изломами в заданных точках) от начальной точки x0 , y0  до
точки xi , yi . В каждом узле xi , yi  сплайн-кривой определяются две
первые производные pxi , pyi  соответственно от X и Y по параметру t ,
вместе они задают вектор касательной к сплайн-кривой. Процедура
VSpline, вычисляющая недостающие производные pxi , pyi , а также
рассчитывающая Xv, Yv - координаты сплайн-кривой, написана на
VBA и имеет вид:
45
Sub VSpline(t As Double, ByVal n As Long, X() As Double, Y() _
As Double, tPxy() As Double, Kod As Long, Vx As Double, Vy As Double)
' Процедура, использующая функцию HS для расчѐта
' параметрического кубического сплайна двух переменных
' x(1 To n), y(1 To n), Kod - описаны в HS, кроме того,
'если Kod <=1, то вычисляются узлы параметрической сетки.
' Массив узлов сетки и производных tPxy(1 to n, 0 To 2):
' tPxy(1 To n, 0) - длина ломанной до i-ой точки, т.е. узлы ti
' tPxy(1 To n, 1) – производные dX/dt по t в узлах ti
' tPxy(1 To n, 2) – производные dY/dt по t в узлах ti
' Vx,Vy – вычисленные координаты сплайн-кривой для значения t
Dim KodErr As Long, KD As Long
If Kod <= 1 Then
tPxy(1, 0) = 0#
For i = 2 To N ' Расчѐт узлов параметрической сетки
tPxy(i, 0) = Sqr((X(i) - X(i - 1)) ^ 2+(Y(i) - Y(i - 1)) ^ 2)+tPxy(i - 1, 0)
Next i
End If
KD = Kod
Vx = HS(t, N, tPxy(1, 0), X(1), tPxy(1, 1), KD, KodErr)
If KodErr <> 0 Then Stop
Vy = HS(t, N, tPxy(1, 0), Y(1), tPxy(1, 2), Kod, KodErr)
If KodErr <> 0 Then Stop
End Sub
Если задать Kod=1 (или
Kod<1) и вызвать проце-
дуру VSpline, то по X,Y-
координатам исходных
точек для рис. 3.3 и 3.5
происходит вычисление Рис. 3.5.
параметров t узлов
сплайн-кривой (см. рис. 3.5). Если для точек с рис. 3.3 задана длина

46
r  p  4 3  1,333 вектора касательной в ячейке F2, а по ней найдены со-

ставляющие px, py этого вектора по формулам px  r  sin(30 )  r  0,5 ,


o

py  r  sin(60o )  r  3 / 2 и записаны в ячейки диапазона D2:E5, то по


данным диапазона A2:E5 можно рассчитать (см. пример 3.3) точки по-
казанной на рис. 3.3 «окружности». Вычисление параметров t узлов
сплайн-кривой (см. диапазон C2:C5 на рис. 3.5) происходит при первом
вызове процедуры VSpline по X,Y-координатам исходных точек (см.
рис. 3.3), когда перед этим обращением задано Kod=1 (или Kod<1).
Пример 3.3. Рассчитать по данным диапазона A2:E5 точки показанной
на рис. 3.3 «окружности»; по точкам построить «окружность».
' Процедура расчѐта координат точек «окружности»:
Const n As Long = 4 ' Число исходных точек.
Const M As Long = 30 ' Мах индекс в массиве рассчитанных точек.
Sub Main() ' Построение «окружности»:
Const pi As Double = 3.14159265
Dim t As Double, Kod As Long, X(1 To n) As Double, Y(1 To n) As Double, _
tPxy(1 To n, 0 To 2) As Double
Dim Xs(M) As Double, Ys(M) As Double
For i = 1 To n ' Ввод данных из ячеек:
X(i) = Cells(i + 1, 1): Y(i) = Cells(i + 1, 2) ' диапазона A2:B5,
tPxy(i, 1) = Cells(i + 1, 4): tPxy(i, 2) = Cells(i + 1, 5) ' диапазона D2:E5.
Next i
Kod = 1 ' Kod > 0 - выполнять расчѐт по заданным коэфф-там сплайна!
For j = 0 To M ' Цикл по рассчитываемым точкам сплайн-кривой
t = dt * j
Call VSpline(t, N, X(), Y(), tPxy(), Kod, Xs(j), Ys(j)) ' опр. координаты точки
If j = 0 Then ' при j=0 определены все параметры сплайна
dt = tPxy(N, 0) / M
For i = 1 To N
Cells(i + 1, 3) = tPxy(i, 0) ' запись параметра кривой в ячейки С2:С5
Next i
End If
47
Cells(j + 2, 7) = Xs(j): Cells(j + 2, 8) = Ys(j) ' запись координат точек
Next j ' окружности в ячейки G2:H32
End Sub
После выполнения этой процедуры выделяем диапазон G2:H32 c рас-
считанными Xs,Ys-координатами параметрического сплайна, выбираем
на ленте Вставка, Диаграммы, Точечная с гладкими кривыми и получа-
ем изображение «окружности». Можно на полученную диаграмму вы-
брать точки исходных данных и, назначив для них точечную диаграм-
му с маркерами, получить картинку, показанную на
рис. 3.3. Для изображѐнных на рис. 3.3 трѐх дуг, опирающихся на цен-
тральный угол в 120°, длина p вектора касательной (отнесѐнная к дли-
не хорды) принята p  4 / 3  1,333. Для углов 90° и 60° рекомендуется
соответственно принимать p  4  2 2  1,172 и p  8  4 3  1,072.
Пример 3.4.
Размеры B, R, d контура сечения уголка, изображѐнного на рис. 3.6, за-
даны в ячейках диапазона A2:С2 (см. рис. 3.7). Пред-
ставить на диаграмме контур заданных размеров и за-
писать в ячейки J2:N2 величины: площадь S сечения,
координаты Xcт, Ycт его центра «масс» («тяжести»)
и главные моменты инерции Jcx, Jcy.

Рис. 3.6.
Решение. Способ 1. Подготовим данные для построе-
ния контура с помощью сплайн-кривой. Начнѐм с концов дуги скругле-
ния, и вместе с координатами точек (в ячейках A4:B5) укажем состав-
ляющие векторов касательных на концах дуги четверти окружности (в
ячейках D4:E5). Затем укажем координаты остальных точек, последова-
тельно обход контур против часовой стрелки. Заметим, что на концах
отрезков прямых также должны указываться векторы касательных в
данном случае можно указать векторы нулевой длины или, как
сделано здесь, в остальных ячейках диапазона D6:E11 ничего не указы-
вать (иметь значение Empty ≡ 0).

48
Таким образом, мы подготовили все необходимые параметры сплайн-
кривой, и можно рассчитать все точки контура, задав в программе пе-
ред расчѐтом Kod=1.
Число рассчитываемых точек контура M
A B C D E
для точности его рисования увеличим до 80
1 B R d
– поскольку весь контур целиком представ-
ляется единой сплайн-кривой. Цикл расчѐта 2 30 5 4
точек сплайн-кривой ничем не отличается 3 X Y t pX pY
от приведѐнного в предыдущем примере. И 4 9 4 0 -1,172 0
также строится по рассчитанным точкам 5 4 9 0 1,172
изображение на точечной диаграмме.
6 4 30
Способ 2. В данном примере трудность вы-
7 0 30
зывает лишь расчѐт точек внутри дуги
скругления. Поэтому можно сначала по па- 8 0 0
раметрам ячеек A4:E5 рассчитать (напри- 9 30 0
мер, как точки сплайн-кривой) точки дуги 10 30 4
скругления, а затем присоединить к ним (в 11 9 4
порядке обхода) координаты остальных
Рис. 3.7.
опорных точек контура. Следуя этому в
программе сначала, назначив N=2 и приняв, например, M=10:
Const N As Long = 2 ' Число исходных точек.
Const M As Long = 10 ' Мах индекс в массиве рассчитанных точек.
надо рассчитать точно так же как в предыдущем примере координаты
Xs(i), Ys(i) точек сплайн-кривой для дуги скругления и поместить их в
ячейки G2:H12. Но для присоединения к контуру ещѐ шести остальных
опорных точек в массивах следует предусмотреть дополнительно 6
элементов, то есть так объявить массивы:
Dim Xs(M + 6) As Double, Ys(M + 6) As Double
После выполнения расчѐта точек дуги скругления выполняют следую-
щий программный код:
i = 6: K = M + 6
For j = M + 1 To K
Xs(j) = Cells(i, 1): Cells(j + 2, 7) = Xs(j)

49
Ys(j) = Cells(i, 2): Cells(j + 2, 8) = Ys(j)
i=i+1
Next j
Он обеспечивает пересылку координат шести точек из ячеек диапазона
A6:B11 в конец массивов Xs, Ys и в ячейки диапазона G13:H18. Таким
образом формируется диапазон G2:H18 с координатами всех точек, но
построение диаграммы по для данного случая следует выполнять толь-
ко прямыми отрезками.
Вычисление площади полученного замкнутого многоугольника (кон-
тура) выполняется по формуле S  0.5  iK1 xi1  yi  xi  yi1  , где K – но-
мер конечной точки, совпадающей с начальной (i=0 – нулевой) точкой.
Для разобранного выше случая 1 принимаем K=M+1=81, а для случая 2
следует принять K=6+M+1=6+10+1=17. Площадь вычисляется по сле-
дующему программному коду:
S=0 ' Вычисление площади S замкнутого многоугольника
For i = 1 To K
S = S + Xs(i - 1) * Ys(i) - Xs(i) * Ys(i - 1)
Next i
S = 0.5 * Abs(S): Cells(2, 9) = S ' Запись значение площади а ячейку J2
Координаты центра «масс» можно найти по формулам Xcm   My S ,
Ycm Mx S через статические моменты My , Mx , которые вычисляются
по формулам:

Mx  iK1 xi1  xi   yi21  yi1  yi  yi2 / 6 , 
My  iK1 yi1  y  x
i i1  xi1
2
 x  x / 6 .
i
2
i

Главные моменты инерции (моменты инерции относительно осей,


проходящих через центр масс) можно рассчитать по формулам
Jcx  Jx  S  (Xcm)2 , Jcy  Jy  S  (Ycm)2 через моменты инерции Jx , Jy
(относительно координатных осей), которые вычисляются по форму-
лам:  
Jx  iK1 yi2  yi21   yi  yi1  xi  xi1  /12 ,

Jy  iK1 x
2
i  x  x
 xi21 i i1    yi  yi1  / 12 .
50
Программный код для расчета указанных характеристик имеет вид:

Mx = 0: My = 0 ' Вычисление координат центра масс:


For j = 1 To K
Mx = Mx + (Xs(i- 1) - Xs(i)) * (Ys(i - 1) ^ 2 + Ys(i - 1) * Ys(i) + Ys(i) ^ 2) / 6
My = My + (Ys(i - 1) - Ys(i)) * (Xs(i - 1) ^ 2 + Xs(i - 1) * Xs(i) + Xs(i) ^ 2) / 6
Next i
Ycm= Mx / S: Cells(2, 12) = Ycm ' запись Ycm в ячейку K2
Xcm = -My / S: Cells(2, 11) = Xcm ' запись Ycm в ячейку L2
Jx = 0: Jy = 0 ' Вычисление главных моментов инерции:
For i = 1 To K
Jx = Jx + Abs((Ys(j) ^ 2 + Ys(i - 1) ^ 2) * (Ys(i) + Ys(i - 1)) * (Xs(i) - Xs(i - 1))) /12
Jy = Jy + Abs((Xs(j) ^ 2 + Xs(j - 1) ^ 2) * (Xs(j) + Xs(j - 1)) * (Ys(j) - Ys(j - 1))) /12
Next i
Jсx = Jx - S * Xzt ^ 2: Cells(2, 13) = Jсx ' запись Jcx в ячейку M2
Jсy = Jy - S * Yzt ^ 2: Cells(2, 14) = Jсy ' запись Jcy в ячейку N2
End Sub

После получения в ячейках J2:N2 параметров сечения (см. рис. 3.8)

J K L M N
1 S= Xcm= Ycm= Jcx= Jcy=
2 229,4382 8,873324 8,873324 18637,51 18637,51
Рис. 3.8.
можно показать на диаграмме точку-центр масс. Для этого следует, вы-
делив через контекстное меню легенду, выбрать данные, добавить имя
(Ycm, Xcm) и адреса ячеек K2, L2 с координатами и нажать OK, а за-
тем, выделив только имя легенды (Ycm, Xcm), изменить тип
диаграммы на точечная с маркерами – на диаграмме должна
отобразиться в виде маркера точка – центр «масс».

51
Пример 3.5. Профиль храповика (см. рис. 3.9)
задан координатами (см. далее) опорных точек.
Построить по ним профиль, приняв tg  0.1 1;
вычислить площадь контура храповика и коорди-
наты центра тяжести сечения.
Для решения данного примера разместим ис-
ходные данные так, чтобы точки, по которым
строится плавная сплайн-кривая, находились на
краю области данных, например, начинали дан- Рис. 3.9
ные, как показано на рис. 3.10. В ячейках D2:E2 запишем составляю-
щие вектора касательной, показывающего направление кривой в еѐ на-
чальной точке. В концевой точке профиля (в ячейках D6:E6) зададим
вектор касательной как при построении четверти окружности. А коэф-
фициенты сплайн-кривой профиля будем вычислять по точкам в ячей-
ках A2:B6 и этим векторам - для чего необходимо задать в программе
Kod=−11. В остальном, операторы A B C D E
вычисления координат профиля не
1 x y t px py
отличаются от записанных в про-
цедуре предыдущего примера. 2 0 9 -1 -0,1
Xs, Ys – координаты точек сплайна 3 -4 4
также размещаются в ячейках диа- 4 0 0
пазона G2:H32 (над ними в G1:H1 5 4 4
можно указать имена массивов Xs,
6 0 8 -1,172 0
Ys). Но кривая профиля не замкну-
та. Чтобы еѐ замкнуть, введѐм 7 0 9
вслед за последней строкой рас- Рис. 3.10.
считанных точек строку со значе-
ниями 0 и 9 – координатами начальной точки (вместо этого можно бы-
ло, жертвуя именами массивов, записать 0 и 8 в ячейки G1:H1). Теперь,
с учѐтом последней точки, можно представить контур на точечной диа-
грамме, соединив его точки прямыми линиями, и вычислить площадь
внутри полученного замкнутого многоугольника (контура) по формуле
S  0.5  iK1xi1  yi  xi  yi1  , где K – номер конечной точки, совпадаю-

52
щей с начальной (i=0 – нулевой) точкой. Для данного случая K=M+1, и
площадь вычисляется как в предыдущем примере:
S=0 ' Вычисление площади круга:
For i = 1 To M
S = S + Xs(i - 1) * Ys(i) - Xs(i) * Ys(i - 1)
Next i
S = 0.5 * Abs(S): Cells(2, 10) = S ' Запись значение площади а ячейку J2
Расчѐт проводился при M=30. VBA-код и результаты расчѐта см. в
файле Пример_3_5.xlsm папки Examples, упомянутой в приложении.
3.5. Задачи
1. Профиль
штампованной детали
(«стаканчика») показан
на рис. 3.11. Изобразить
профиль на диаграмме и
записать вычисленную
Рис. 3.11.
величину объѐма
«стаканчика» в ячейку
листа Excel.
2. Размеры L, H, R, d профиля, изображѐнного
на рис. 3.12, заданны в ячейках диапазона A2:D2.
Изобразить на диаграмме профиль заданных раз-
меров и записать в ячейку E2 величину площади
профиля.
3. Размеры L, H, R, d профиля, изображѐнного
на рис. 3.13, заданны в ячейках диапазона A2:D2.
Рис. 3.12.
Изобразить на диаграмме профиль заданных раз-
меров и записать в ячейку E2 величину площади
профиля.
4. Размеры L, H, R, d сечения зуба рейки, изо-
бражѐнного на рис. 3.14, заданны в ячейках диапа-
зона A2:D2. Изобразить на диаграмме сечение зуба

53 Рис. 3.13.
заданных размеров и записать в ячейку E2 величину площади сечения
зуба рейки.

Рис. 3.14 Рис. 3.15. Рис. 3.16.


5. Размеры h и b профиля, изображѐнного на рис. 3.15, заданны в
ячейках диапазона A2:B2. Изобразить на диаграмме профиль заданных
размеров и записать в ячейку E2 величину площади профиля.
6. Размеры r, R и h профиля сечения кулачка, изображѐнного на рис.
3.16, заданны в ячейках диапазона A2:C2. Изобразить на диаграмме се-
чение профиля заданных размеров, вычислить и записать в ячейку D2
величину площади сечения профиля
кулачка.
7. Цилиндрическая часть матрицы
штампа (см. рис. 3.17) имеет высоту
H и диаметр D. Координаты криво-
линейной части профиля матрицы
заданы в таблице 3.1. Изобразить на
Рис. 3.17.
точечной диаграмме контур мат-
рицы, вычислить объѐм матрицы, а также площадь поверхности, задан-
ной криволинейной частью профиля. Таблица 3.1
x -200 -183 -127 -48 0 48 127 183 200
y 0 63 110 132 133 132 110 63 0
8. Цилиндрическая часть пуансона (см.
рис. 3.18) имеет высоту H. координаты
профиля нецилиндрической части заданы
в таблице 3.1. Представить на точечной
диаграмме контур пуансона и вычислить
его объѐм, а также площадь поверхности
нецилиндрической части. Рис. 3.18.
54
9. Изобразить на точечной диаграмме кон- R 50 R 50

тур детали, показанной на рис. 3.19; вычислить


площадь фигуры, ограниченной контуром, и

150
координаты центра тяжести фигуры. Указание. 60°

Представить контур сплайн-кривой, разбив


R 50

сплайн-кривую на большое число отрезков.


R 50
100

10. Контур сечения лопатки турбины (см. Рис. 3.19.


рис. 3.20) задан координатами точек (см. Таблица 3.2
таблицу 3.2). Приблизить кривую контура пара-
x y
метрическим сплайном. Изобразить контур на
диаграмме и записать вычисленную величину 236 27
площади сечения и координаты центра тяжести 157 54
сечения в ячейки листа Excel. 90 95
56 142
50 196
69 233
90 245
105 228
109 194
121 149
Рис. 3.20.
149 106
190 66
241 37

55
4. Приложение. Состав вспомогательных программных
средств.
Вспомогательные программные средства, из числа описанных выше,
могут непосредственно использоваться при решении в Excel задач. Для
этого их надо предварительно поместить, например, в папку
C:\Program Files\VBA_Excel (как это сделано в лабораториях универси-
тета) и затем подключать при решении задач.
Состав программных средств:
1. IOmas.bas – модуль с процедурами ввод-вывод массивов, описан-
ными в разделе 1.1.
2. GaussMethod.bas – модуль с макросами для изучения метода Гаус-
са, разобранными в разделе 1.2.
3. Math.bas – модуль с декларациями библиотечных процедур (мето-
да Гаусса и сплайн-интерполяции) и функцией xCdGauss, опреде-
лѐнной пользователем для решения СЛАУ (описанной в
разделе 1.3).
4. Math32.dll – dll-библиотека с кодами процедур метода Гаусса и
сплайн-интерполяции).
5. Maxmin.bas – модуль с функциями Max, Min, Fmt (формат, в кото-
рой положительные числа выводятся с пробелом в позиции знака).
6. Examples – папка с примерами, приведѐнными в пособии.

Модули подключаются для использования командами реактора VBA:


File, Import File… .
Процедуры библиотеки Math32.dll подключаются по ссылкам в
модуле Math.bas на папку с названной библиотекой.

56
Рекомендуемая литература
1. Слепцова Л. Д. Программирование на VBA в Microsoft Office 2010
– М.: Диалектика, 2010, -431с.
2. Лобанов А.С., Туманова М.Б. Решение задач на языке Visual Basic
for Applications: учебное пособие. –М.; МГТУ «МАМИ», 2009., -
90с.
3. Антомони В.И., Архипов В.Н., Любин А.Н., Тихомиров В.Н. Про-
граммирование на VBA а Microsoft Office: сборник лабораторных
работ. –М.; МГТУ «МАМИ», 2011., -152с.
4. Калядин В.И., Макаров А.И. Основы работы на персональном
компьютере. Использование программных средств при проекти-
ровании автомобильных конструкций. –М.; МГТУ «МАМИ»,
2010., -85с.

57
СОДЕРЖАНИЕ
Введение ..................................................................................................... 3
1. Действия с массивами в Excel и в VBA ......................................... 3
1.1. Процедуры ввода-вывода массивов .............................................. 3
1.2. Изучение в Excel метода Гаусса .................................................... 9
1.3. Применение в Excel процедуры метода Гаусса ......................... 16
1.4. Задачи ............................................................................................. 22
1.5. Решение переопределѐнной системы n линейных уравнений
с m неизвестными (n > m) ........................................................... 25
1.6. Задачи .............................................................................................. 28
2. Решение в Excel нелинейного уравнения .................................... 31
2.1. Встроенные и дополнительные средства решения ................... 31
2.2. Задачи .............................................................................................. 33
3. Представление данных в виде графиков и диаграмм .............. 36
3.1. Построение графиков ................................................................... 36
3.2. Изображение плоских параметрических кривых ...................... 37
3.3. Задачи ............................................................................................. 39
3.4. Использование сплайн-функций и сплайн-кривых ................... 42
3.5. Задачи ............................................................................................. 53
4. Приложение. Состав вспомогательных программных средств .....56
Рекомендуемая литература ................................................................. 57

58
Учебное издание

Калядин Вячеслав Иванович

Решение задач в Excel на VBA.


Применение программных средств в проектировании
автомобильных конструкций.

Под редакцией авторов


Оригинал-макет подготовлен редакционно-издательским отделом
МГТУ «МАМИ»

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

Подписано в печать 21.12.11 Формат 90x60 1/16 Бумага 80 г/м2


Гарнитура «Таймс». Ризография. Уч. печ. л. 3,5 .
Тираж 100 экз. Заказ № 233-11

МГТУ «МАМИ»
107023, г. Москва, Б.Семѐновская ул. 38
59