Академический Документы
Профессиональный Документы
Культура Документы
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ «МАМИ»
В.И.Калядин
МОСКВА 2011
УДК 681.3.06
Разработано в соответствии с Государственным образовательным
стандартом ВПО 2000 г. для специальности Автомобиле- и тракто-
ростроение на основе рабочей программы дисциплины «Информатика»
©Калядин В.И.,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
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
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
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
предыдущие уравнения. Затем находится
xn1 , и так далее. То есть осуществляется обратная подстановка ме-
тода Гаусса.
Отметим особенности реализации алгоритма
Перестановку строк выполняется умножением матрицы перестановок
на матрицу 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.
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
число обусловленности матрицы системы.
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 ? Замечание. Матрица Lk1 по-
лучается из 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 bn1 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)
Метод решения (метод наименьших квадратов). Уравнения F c y (на-
зываемые уравнениями наблюдений) можно записать в виде
1 1 0 1 0 0
1 с
2 1 0
1 c1 1 c2 0 F1 c1 F2 c2 y ,
с
1 3 2 1 1
2
1
где F j означает вектор - j-столбец матрицы
(т.е. первый индекс « » пробегает все значе-
ния номеров строк). Изобразим на рис. 1.5
координатную систему, по осям которой бу-
дем откладывать каждую из трех координат
векторов-столбцов.
Векторы v Fc F1 c1 F2 c2 при различ-
ных c1, c2 лежат в плоскости , определяе-
мой векторами F1 , F2 . Вектор Δ 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
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.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
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
нение скорости ограничить диапазоном v 50 / 3.6 м / сек; 115/ 3.6 м / сек.
8. Решить задачу 5 для автомобиля с двигателем, удельная тяга
которого (на прямой передаче) изменяется по закону
T v 3 v 10 0.2 v 103 н / кг .
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.
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. Задачи
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
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, а по ней найдены со-
Рис. 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 iK1 xi1 yi xi yi1 , где 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 iK1 xi1 xi yi21 yi1 yi yi2 / 6 ,
My iK1 yi1 y x
i i1 xi1
2
x x / 6 .
i
2
i
Jy iK1 x
2
i x x
xi21 i i1 yi yi1 / 12 .
50
Программный код для расчета указанных характеристик имеет вид:
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 iK1xi1 yi xi yi1 , где 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 величину площади сечения
зуба рейки.
150
координаты центра тяжести фигуры. Указание. 60°
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 – папка с примерами, приведѐнными в пособии.
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
Учебное издание
МГТУ «МАМИ»
107023, г. Москва, Б.Семѐновская ул. 38
59